LWJGL中的纹理映射

时间:2013-08-04 22:30:35

标签: animation sprite lwjgl

这让我在过去几天疯狂。

我正在为spritesheet制作动画,它实际上在我的96px 384px纹理上效果很好用这段代码:

    glBegin(GL_QUADS);
        glTexCoord2f((frameCount*24.0f)/imgWidth, (row*24.0f)/imgHeight); glVertex3f(0+x, 0+y, -0.001f*(y+32));
        glTexCoord2f((frameCount*24.0f)/imgWidth, ((row+1)*24.0f)/imgHeight); glVertex3f(0+x, 32+y, -0.001f*(y+32));
        glTexCoord2f(((frameCount+1)*24.0f)/imgWidth, ((row+1)*24.0f)/imgHeight); glVertex3f(32+x, 32+y, -0.001f*(y+32));
        glTexCoord2f(((frameCount+1)*24.0f)/imgWidth, (row*24.0f)/imgHeight); glVertex3f(32+x, 0+y, -0.001f*(y+32));
    glEnd();

问题是,当我加载32px 32px纹理时,它看起来很奇怪!我怀疑24.0f的数字应该根据纹理大小而有所不同,但我无法弄清楚如何。

第二个问题:这种方法如何影响性能,有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

x轴(宽度或 u 值)的纹理坐标应为:

frameCount * (frameWidth / imgWidth)

frameWidth是纹理中每个帧的宽度,imgWidth是纹理的总宽度。

y轴(高度或 v 值)的纹理坐标应为:

frameCount * (frameHeight / imgHeight)

frameHeight是纹理中每个帧的高度,imgHeight是纹理的总高度(在这种情况下它们可能是相同的,因为每个帧纹理在这里与整个纹理具有相同的高度 - 或者那就是我'我假设通过查看你的代码。)

如果希望代码更高效,可以预先计算每个四元组多次发生的乘法运算。所以你可以预先计算:

float widthFraction = frameWidth / imgWidth;
float heightFraction = frameHeight / imgHeight;

顺便说一句,这同样适用于顶点坐标计算。

超过数十万个顶点,这肯定会加快计算速度,但你应该比较两种方法来看多少。