纹理停止正常工作

时间:2013-01-15 23:38:51

标签: opengl textures

最近我的纹理发疯了。我试图映射的最后2个纹理如下图所示。我希望它出现在第一张照片中,但不管我做了什么,它都坚持像后者一样出现。请忽略文本,它与纹理无关。

enter image description here enter image description here

我正在使用GLUT进行openGL窗口化,以及GLM obj loader的tga阅读器。我以前多次使用过这款读卡器,没有任何问题。它刚刚停止工作,我最后两次尝试加载纹理。相关代码如下:

Texture onScreenTexture;


if (LoadTGA(&onScreenTexture, "back.tga")) 
    { 
        glGenTextures(1, &onScreenTexture.texID);
        glBindTexture(GL_TEXTURE_2D, onScreenTexture.texID);
        glTexImage2D(GL_TEXTURE_2D, 0, onScreenTexture.bpp / 8, onScreenTexture.width, onScreenTexture.height, 0, onScreenTexture.type, GL_UNSIGNED_BYTE, onScreenTexture.imageData);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

        if (onScreenTexture.imageData) 
        {
            free(onScreenTexture.imageData);
        }
    }

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

    glBegin(GL_QUADS);
        glTexCoord2f(0,0); glVertex2f(10.0, 10.0);
        glTexCoord2f(0,1); glVertex2f(260, 10.0);
        glTexCoord2f(1,1); glVertex2f(260, 110);
        glTexCoord2f(1,0); glVertex2f(10.0, 110);
    glEnd();
    glDisable(GL_TEXTURE_2D);

1 个答案:

答案 0 :(得分:3)

这与宽度/高度的比例无关(尽管你似乎将其旋转90度,导致一些额外的拉伸),但是包含像素行。从对角线模式中可以看出这一点,表明了渐进式对齐问题,以及彩色条纹,表明RGB数据在每一行上都是不对齐的。

在你的情况下,你正在加载一个没有行填充的TGA,但是将它传递给GL,默认情况下要求将像素行填充到4个字节的倍数。

你的工作纹理可能是32位而不是24位,或者是4像素宽的倍数,其中任何一种都可以自然对齐。

可能的解决方法是:

  • 更改纹理的尺寸,这样就不会有填充。
  • 更改纹理的加载,使填充与GL期望的结果一致
  • 使用(例如)glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • 告诉GL您的纹理是如何打包的