Qt openGL纹理仅显示纹理的红色部分
我正在尝试将图像纹理映射到单个多边形。我的图像被正确读取,但只有图像的红色平面被纹理化 我在QGLWidget中做这件事 我在读取图像后检查了它,并且它的组件被正确读取——也就是说,我得到了绿色和蓝色平面的有效值 这是密码Qt openGL纹理仅显示纹理的红色部分,qt,opengl,texture-mapping,Qt,Opengl,Texture Mapping,我正在尝试将图像纹理映射到单个多边形。我的图像被正确读取,但只有图像的红色平面被纹理化 我在QGLWidget中做这件事 我在读取图像后检查了它,并且它的组件被正确读取——也就是说,我得到了绿色和蓝色平面的有效值 这是密码 QImageReader *theReader = new QImageReader(); theReader->setFileName(imageFileName); QImage theImageRead = theReader->read();
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;
}
QImageReader*theReader=new QImageReader();
theReader->setFileName(图像文件名);
QImage theImageRead=阅读器->读取();
if(theImageRead.isNull())
{
ValidFile=无效的图像文件;
返回;
}
其他的
{
int newW=1;
int newH=1;
while(newW
然后我画成这样:
{
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);
}
{
glEnable(GL_纹理_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());
格伦德();
glDisable(GL_纹理_2D);
}
是否有人看到任何会导致我的纹理被解释为(r,0,0,1)值的东西?(r、g、b、a)
Qt4.7.1、Ubuntu 10.04、openGl 2.0之类的
提前感谢您的帮助这是一个非常常见的问题。首先,将MIN/MAG过滤器设置为某个值,因为默认值使用mipmap,并且因为您没有提供mipmap,所以纹理不完整 对不完整纹理进行采样通常会得到白色。使用默认纹理环境的glColor调用将顶点颜色与纹理颜色相乘。你可能有类似glColor(红色)和red*white=红色的东西,这就是为什么你看到红色
要解决此问题,请将“最小/最大”过滤器设置为“GL_线性”或“GL_最近”。我也遇到过类似的问题。我发现在绘制纹理化四边形之前,我必须将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);
...
您是否在忘记的地方调用了
glColor()
调用?在内部,OpenGL接受internalFormat参数,并对数据应用所需的计算,以获得所需的格式。就GL而言,这样做的结果(如果我正确理解文档)始终是RGBA图像。如果出于测试目的,在函数调用中显式地将internalFormat设置为GL_RGBA而不是GL_RGB,会发生什么情况?没有什么--在allI处没有区别--没有区别。我还使用了glTexEnvi(GL_TEX_ENV,GL_TEX_ENV_MODE,GL_REPLACE),这让一切都不同了——似乎很有效。你试过了吗?我知道这似乎无关紧要,但确实如此。(无论如何对我来说;-)这对我来说也很有效。我还没有找到任何文件或任何东西说你需要重置颜色,虽然,所以它似乎有点粗略。