LWJGL OpenGL精灵表

s5d*_*s5d 4 java opengl lwjgl

我是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);
Run Code Online (Sandbox Code Playgroud)

让我与整个精灵表所以矩形uvglTexCoord2f 具有小于1.0F.

我现在需要的是一个公式,将计算uv纹理中的任何精灵的ID.

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...
Run Code Online (Sandbox Code Playgroud)

我想要一个uv任何这些ID.最后一点没有得到很好的解释,所以如果你愿意,我会更好地解释它.

先感谢您!

Jac*_*ope 5

图像中精灵纹理的位置是16 x 16阵列,因此纹理的位置(如果将第一个计算为0)是:

row = texNo / 16;
col = texNo % 16;
Run Code Online (Sandbox Code Playgroud)

然后坐标是:

u0 = row / 16;
u1 = (row + 1) / 16;

v0 = col / 16;
v1 = (col + 1) / 16; 
Run Code Online (Sandbox Code Playgroud)

然后在适当的时候用u1或v1替换1.0f,在glTexCoord2Df调用中用u0或v0替换0.0f.