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);

给了我一个带有整个精灵表的矩形,因此必须u小于1.0fvglTexCoord2f

我现在需要的是一个公式,它将计算纹理中任何精灵 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 中的任何一个设置一个uand v。最后一点解释得不是很好,所以如果你愿意,我会解释得更好。

先感谢您!

4

2 回答 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。

于 2010-12-27T20:13:07.920 回答
1

精灵表从 0..1 英寸uv. 如果它是 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 中使用整数类型来表示纹理坐标。

于 2010-12-27T20:12:09.343 回答