1

我一直在尝试在屏幕上显示块,每个块都有不同的纹理。我已经设置了精灵表以及代码。但是我无法在 spritesheet 中获取特定坐标,我无法将其他任何内容显示为第一张图像。

我已经设置了这个渲染功能:

public static void render(int texture, int blockID) {
    float xPos = (float)blockID;
    float yPos = 0;

    while(xPos > 9) {
        xPos -= 10;
        yPos++;
    }

    glBindTexture(GL_TEXTURE_2D, texture);

    glPushMatrix();
        glBegin(GL_TRIANGLES);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 0);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 0);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 16);

            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(0, 16);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 16);
            glTexCoord2f((8f / 160f) * xPos, (8f / 160f) * yPos); glVertex2i(16, 0);
        glEnd();
    glPopMatrix();
}

它决定从 blockID 中获取哪个纹理,因此如果 blockID 为 1,则从 spritesheet 中获取第二张图像,如果为 2,则从 spritesheet 中获取第三张图像,依此类推。

但我不知道我必须在哪里将 xPos 和 yPos 变量乘以 glTexCoord2f。我尝试了不同的方法,例如:

glTexCoord2f(xPos / 128f, 0f / 128f); glVertex2i(16, 0);
glTexCoord2f(0f / 128f, yPos / 128f); glVertex2i(0, 16);

或者

glTexCoord2f((0f / 128f) * xPos, 0f / 128f; glVertex2i(16, 0);
glTexCoord2f(0f / 128f, (8f / 128f)) * yPos; glVertex2i(0, 16);

乃至

glTexCoord2f(0f / 128f, 0f / 128f); glVertex2i(16 * xPos, 0);
glTexCoord2f(0f / 128f, 8f / 128f); glVertex2i(0, 16 * yPos);

但没有一个奏效。

=== 编辑 ===

我几乎设法让它工作。但只有奇数的blockID。如果 blockID 为 1,则显示第一个纹理,但如果为 2,则显示褐色(不在我的 spritesheet 上),如果 blockID 为 3,则在工作表上显示第二个纹理,依此类推。

4

1 回答 1

0

纹理坐标存在范围内:0.0f --> 1.0f

您需要计算您的精灵在图像上的距离(百分比),然后将其作为浮点数输入 TexCoord。

我认为你应该使用:

   (8.0f / 128.0f) * xPos             (you should cache the float once it works)

如果这不起作用,请确保以下两点:

  • 硬编码值有效(证明您的纹理已加载并初始化良好)
  • 在您的渲染方法中计算正确的值

或者,不要忘记使用 glColor(1.0f, 1.0f, 1.0f) 渲染三角形,以确保应用程序中的其余渲染工作正常。

于 2013-05-22T09:49:01.997 回答