openGL纹理只显示纹理的红色部分

问题描述:

我想将纹理映射到单个多边形。我的图像正在被正确读取,但只有图像的红色平面被纹理化。openGL纹理只显示纹理的红色部分

我内的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); } 

是否有人看到任何会导致出现interpreded我的质地,就好像它是值(R,0,0,1)? (R,G,B,A)?

QT 4.7.1,Ubuntu的10.04,OpenGL的2.something或其他

在此先感谢您的帮助

+1

你有一个'glColor()`调用你忘了吗? – genpfault 2011-01-11 16:13:34

+0

在内部,OpenGL采用internalFormat参数并将所需的任何计算应用于您的数据以获得所需的格式。这个结果(如果我正确理解文档)始终是一个RGBA图像,就GL而言。出于测试目的,如果在函数调用中明确将internal格式设置为GL_RGBA而不是GL_RGB,会发生什么情况? – badgerr 2011-01-11 16:50:09

+0

没有什么 - 完全没有区别 – jhowland 2011-01-11 18:11:25

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

采样不完整的纹理通常会产生白色。使用默认纹理环境的glColor调用将使顶点颜色与纹理颜色相乘。你可能有像glColor(红色)和红色*白色=红色的东西,所以这就是为什么你看到红色。

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

我有过类似的问题。我发现在绘制纹理化的四边形之前,我不得不将“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); 
...