【问题标题】:LWJGL OpenGL sprite sheetLWJGL OpenGL 精灵表
【发布时间】:2010-12-27 20:06:53
【问题描述】:

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

给我一​​个包含整个精灵表的矩形,所以uglTexCoord2fv 小于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。最后一点解释得不是很好,如果你愿意,我会解释得更好。

提前谢谢你!

【问题讨论】:

    标签: java opengl lwjgl


    【解决方案1】:

    图像中精灵纹理的位置在一个 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到左上角的1​​5等等。
    • 在这种情况下,您想要的 row 和 col 的值可能是: row = (16 - texNo) % 16; col = texNo / 16;
    【解决方案2】:

    sprite 表从 uv 中的 0..1 扩展。如果是 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 中使用整数类型来表示纹理坐标。

    【讨论】:

    • 如果有其他不同宽度/高度的纹理表呢?
    • 工作表的绝对宽度/高度无关紧要(它总是映射到 1x1 uv 单位)。如果您的意思是您的表格具有不同的精灵矩阵(例如 2x2、16x16 ......),您总是可以缩放为最好的。
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2012-07-31
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多