0

我正在尝试将图像纹理映射到单个多边形。我的图像被正确读取,但只有图像的红色平面被纹理化。

我在 QGLWidget 中这样做

我在读取图像后检查了图像,并且它的组件被正确读取——即,我得到了绿色和蓝色平面的有效值。

这是代码

QImageReader    *theReader = new QImageReader();

theReader->setFileName(imageFileName);
QImage  theImageRead = theReader->read();
if(theImageRead.isNull())
    {
        validTile = NOT_VALID_IMAGE_FILE;
        return;
    }
else
    {
        int newW = 1;
        int newH = 1;
        while(newW < theImageRead.width())
            {
                newW *= 2;
            }
        while(newH < theImageRead.height())
            {
                newH *= 2;
            }
        theImageRead = theImageRead.scaled(newW, newH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
// values checked in theImageRead are OK here
        glGenTextures(1,&textureObject);
        theTextureImage = QGLWidget::convertToGLFormat(theImageRead);
// values checked in theTextureImage are OK here
        glBindTexture(GL_TEXTURE_2D, textureObject);
        glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,newW, newH, 0, GL_RGBA, GL_UNSIGNED_BYTE,theTextureImage.bits() );
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glFlush();
        validTile = VALID_TEXTURE;
        return;
    }

then I draw like this:

{

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textureTiles[tN]->getTextureObject() );
glBegin(GL_QUADS);

                    glTexCoord2f(0.0,0.0);
                    glVertex2f(textureTiles[tN]->lowerLeft.x(), textureTiles[tN]->lowerLeft.y());

                    glTexCoord2f(1.0,0.0);
                    glVertex2f(textureTiles[tN]->lowerRight.x(), textureTiles[tN]->lowerRight.y());

                    glTexCoord2f(1.0,1.0);
                    glVertex2f(textureTiles[tN]->upperRight.x(), textureTiles[tN]->upperRight.y());

                    glTexCoord2f(0.0,1.0);
                    glVertex2f(textureTiles[tN]->upperLeft.x(), textureTiles[tN]->upperLeft.y());

glEnd();

glDisable(GL_TEXTURE_2D);

}

有没有人看到任何会导致我的纹理被解释为 (r,0,0,1) 的值的东西?(r,g,b,a)?

QT 4.7.1、Ubuntu 10.04、openGl 2.something 或其他

提前感谢您的帮助

4

2 回答 2

7

我有一个类似的问题。我发现在绘制纹理化四边形之前,我必须将 gl 颜色“重置”为白色和不透明,否则颜色会变得混乱。像这样:

...
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,textureTiles[tN]->getTextureObject() );

glColor4f(1.0, 1.0, 1.0, 1.0); // reset gl color

glBegin(GL_QUADS);
...
于 2011-01-12T22:40:56.337 回答
2

这是一个非常普遍的问题。首先,将您的 MIN/MAG 过滤器设置为某个值,因为默认值使用 mipmap,并且由于您没有提供 mipmap,因此纹理不完整。

对不完整的纹理进行采样通常会产生白色。使用默认纹理环境调用 glColor 会将顶点颜色与纹理颜色相乘。您可能有类似 glColor(red) 和 red * white = red 的东西,所以这就是您看到红色的原因。

要修复它,请将 MIN/MAG 过滤器设置为 GL_LINEAR 或 GL_NEAREST。

于 2011-01-11T16:54:40.070 回答