我一直在尝试在屏幕上显示 block ,每个 block 都有不同的纹理。我已经设置了 Sprite 表和代码。但我无法在 Sprite 表中获取特定坐标,无法将其他任何内容显示为第一张图像。
我已经设置了这个渲染函数:
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);
但没有任何效果。
===编辑===
我几乎已经让它工作了。但仅限于奇数 block ID。如果 blockID 为 1,则显示第一个纹理,但如果为 2,则显示棕色(不在我的 spritesheet 上),如果 blockID 为 3,则在工作表上显示第二个纹理,等等。
最佳答案
纹理坐标存在于以下范围内:0.0f --> 1.0f
您需要计算 Sprite 沿图像的距离(以百分比表示),然后将其作为 float 输入到 TexCoord 中。
我认为你应该使用:
(8.0f / 128.0f) * xPos (you should cache the float once it works)
如果这不起作用,请确保以下两件事:
- 硬编码值有效(证明您的纹理已加载并初始化良好)
- 正在您的渲染方法中计算正确的值
或者,不要忘记使用 glColor(1.0f, 1.0f, 1.0f) 渲染三角形,以确保应用程序中的其余渲染工作正常。
关于java - 根据 ID 在 spritesheet 中显示纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686772/