基于ID在spritesheet中显示纹理

时间:2013-05-22 08:16:04

标签: java opengl textures lwjgl sprite-sheet

我一直在尝试在屏幕上显示块,每块都有不同的纹理。我已经设置了spritesheet以及代码。但我无法设法在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则需要第三个图像,等等。

但我不知道在哪里将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,则在工作表上显示第二个纹理等。

1 个答案:

答案 0 :(得分: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)渲染三角形,以确保应用程序中的其余渲染工作。