LWJGL OpenGL 精灵表

4

我是OpenGL的新手,目前正在尝试渲染一个立方体,其中四个面各有不同的纹理。

众所周知,为每个面类型单独使用纹理会占用大量内存,并使应用程序变慢。

目前我正在尝试为精灵使用纹理表。我有一个图形文件,每个纹理都是16x16像素,256个精灵排列成一个正方形(16x16)。

我知道

GL11.glTexCoord2f(1.0f, 0.0f);
GL11.glVertex3f(1.0f, 1.0f,  1.0f);
GL11.glTexCoord2f(0.0f, 0.0f);
GL11.glVertex3f(0.0f, 1.0f, 1.0f);
GL11.glTexCoord2f(0.0f, 1.0f);
GL11.glVertex3f(0.0f, 0.0f, 1.0f);
GL11.glTexCoord2f(1.0f, 1.0f);
GL11.glVertex3f(1.0f, 0.0f, 1.0f);

这会给我一个包含整个精灵表的矩形,所以glTexCoord2f中的uv必须小于1.0f。

现在我需要的是一个公式,可以计算纹理中任何精灵id的uv

纹理位图中的ID如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 16 20 21 22 23 24...

我希望对于这些ID中的任何一个,都能拥有uv。最后一部分没有被很好地解释清楚,如果您需要的话,我可以更好地解释一下。

提前感谢您!

2个回答

5
精灵纹理在图像中的位置是一个16 x 16数组,因此纹理的位置(如果您将第一个视为0)如下所示:
row = texNo / 16;
col = texNo % 16;

接下来的坐标为:
u0 = row / 16;
u1 = (row + 1) / 16;

v0 = col / 16;
v1 = (col + 1) / 16; 

然后在glTexCoord2Df调用中,将1.0f替换为相应的u1或v1,将0.0f替换为u0或v0。


我现在遇到的问题是ID从左下角的0到左上角的15等等。 - s5d
在这种情况下,你想要的行和列的值可能是:row = (16 - texNo) % 16; col = texNo / 16; - Jackson Pope

1
精灵表从0到1在u和v扩展。如果它是16x16,那么左上角位于n/16, m/16,其中n、m范围从0到15。如果您的表都是16x16,您可以通过将1/16分解为纹理矩阵来简化您的生活:
        glMatrixMode(GL_TEXTURE)
        glLoadIdentity()
        glScalef(1f/16f, 1f/16f, 1f)

这将使您能够使用整数来定位矩阵中的精灵,例如0,0、1,0、2,0等,因为矩阵中的缩放。

使用纹理矩阵的另一个优点是,您的纹理坐标变成整数,现在可以在顶点数组或VBO中使用整数类型来表示纹理坐标。


有没有其他不同宽度/高度的纹理图集呢? - s5d
纸张的绝对宽度/高度并不重要(它总是映射到1x1的uv单位)。如果你指的是具有不同精灵矩阵的纸张(例如2x2,16x16,...),你可以始终按最精细的进行缩放。 - Ben Jackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接