1

最近我的纹理变得疯狂。我尝试映射的最后 2 个纹理如下图所示。我希望它出现在第一张照片中,但无论我做什么,它都坚持出现在后一张照片中。请忽略文字,它与纹理无关。

在此处输入图像描述 在此处输入图像描述

我正在为我的 openGL 窗口和 GLM obj loader 的 tga 阅读器使用 GLUT。我之前多次使用阅读器,没有任何问题。它刚刚停止了我最近两次加载纹理的尝试。相关代码如下:

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);
4

1 回答 1

3

这与宽度/高度的比率无关(尽管您似乎将其渲染为 90 度旋转,导致一些额外的拉伸),但与像素行的打包有关。这从对角线图案中很明显,表明存在渐进对齐问题,还有彩色条纹,表明 RGB 数据在每条线上的未对齐方式不同。

在您的情况下,您正在加载一个 TGA,它没有行填充,但将其传递给 GL,默认情况下期望像素行填充为 4 个字节的倍数。

您的工作纹理可能是 32 位而不是 24 位,或者是 4 像素宽的倍数,这两者都可以提供自然对齐。

可能的解决方法是:

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