Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt openGL纹理仅显示纹理的红色部分_Qt_Opengl_Texture Mapping - Fatal编程技术网

Qt openGL纹理仅显示纹理的红色部分

Qt openGL纹理仅显示纹理的红色部分,qt,opengl,texture-mapping,Qt,Opengl,Texture Mapping,我正在尝试将图像纹理映射到单个多边形。我的图像被正确读取,但只有图像的红色平面被纹理化 我在QGLWidget中做这件事 我在读取图像后检查了它,并且它的组件被正确读取——也就是说,我得到了绿色和蓝色平面的有效值 这是密码 QImageReader *theReader = new QImageReader(); theReader->setFileName(imageFileName); QImage theImageRead = theReader->read();

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

我在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;
    }
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),这让一切都不同了——似乎很有效。你试过了吗?我知道这似乎无关紧要,但确实如此。(无论如何对我来说;-)这对我来说也很有效。我还没有找到任何文件或任何东西说你需要重置颜色,虽然,所以它似乎有点粗略。