1

在过去的几天里,这一直让我发疯。

我正在为 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 应该根据纹理大小而有所不同,但我不知道如何。

第二个问题:这种方法对性能有什么影响,有没有更好的方法呢?

4

1 回答 1

0

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

frameCount * (frameWidth / imgWidth)

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

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

frameCount * (frameHeight / imgHeight)

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

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

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

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

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

于 2013-11-21T10:40:48.923 回答