2

由于openGL的纹理映射,我快要发疯了。它永远不会映射正确的东西,请看一下。

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, speed.texID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

glBegin(GL_QUADS);
    glTexCoord2f(1,0); 
    glVertex2f(210, 638);   //Top-Left
    glTexCoord2f(1,1);
    glVertex2f(210, 438);   //Top-Right
    glTexCoord2f(0,1); 
    glVertex2f(10, 438);    //Bottom-Right
    glTexCoord2f(0,0);
    glVertex2f(10, 638);    //Bottom-Left
glEnd();
glDisable(GL_TEXTURE_2D);

此代码输出图像后变成这样: 在此处输入图像描述

但我希望它是这样的: 在此处输入图像描述

当我将纹理更改为其他内容时,它会正确映射它,但显然不是这个。为什么你认为这可能是?

4

2 回答 2

4

如果其他纹理有效,则该纹理可能是奇数大小或不同格式,并且已在未观察到一些必要填充的情况下加载。

纹理格式通常需要偶数个像素,或者四舍五入到其他倍数。

纹理的 45 度倾斜也表明了这种问题,因为它通常是由于管道中某个点的每一行都读取(或跳过)一个额外的像素造成的。

可能的解决方法是:

  • 更改纹理的尺寸,以便没有填充。
  • 更改纹理的加载,使填充与 GL 期望的一致
  • 告诉 GL 你的纹理是如何打包的,使用glPixelStorei()
于 2013-01-14T10:44:24.603 回答
1

如果您使用的纹理不能对齐到 4 个字节,您必须关心一些事情,其中​​之一是设置正确的像素包和解包对齐:

glPixelStorei(GL_PACK_ALIGNMENT, 1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

有关更多信息,请参见此处。

于 2013-01-14T10:53:38.177 回答