这让我在过去几天疯狂。
我正在为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的数字应该根据纹理大小而有所不同,但我无法弄清楚如何。
第二个问题:这种方法如何影响性能,有更好的方法吗?
答案 0 :(得分:0)
x轴(宽度或 u 值)的纹理坐标应为:
frameCount * (frameWidth / imgWidth)
frameWidth是纹理中每个帧的宽度,imgWidth是纹理的总宽度。
y轴(高度或 v 值)的纹理坐标应为:
frameCount * (frameHeight / imgHeight)
frameHeight是纹理中每个帧的高度,imgHeight是纹理的总高度(在这种情况下它们可能是相同的,因为每个帧纹理在这里与整个纹理具有相同的高度 - 或者那就是我'我假设通过查看你的代码。)
如果希望代码更高效,可以预先计算每个四元组多次发生的乘法运算。所以你可以预先计算:
float widthFraction = frameWidth / imgWidth;
float heightFraction = frameHeight / imgHeight;
顺便说一句,这同样适用于顶点坐标计算。
超过数十万个顶点,这肯定会加快计算速度,但你应该比较两种方法来看多少。