OpenGL纹理未显示。

6

我正在尝试在Qt中使用OpenGL显示纹理,但运行时纹理却无法显示。

经过一些研究,我发现需要将纹理的高度和宽度设置为2的幂次方。我的纹理现在是1024x1024大小。

我还添加了许多glTexParameterf函数来解决问题,但仍然没有成功。

void WorldView::paintGL ()
{
this->dayOfYear = (this->dayOfYear+1);
this->hourOfDay = (this->hourOfDay+1) % 24;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

// store current matrix
glMatrixMode( GL_MODELVIEW );
glPushMatrix( );

gluLookAt(camPosx ,camPosy ,camPosz,
    camViewx,camViewy,camViewz,
    camUpx, camUpy, camUpz );

//Draw Axes
glDisable( GL_LIGHTING );
glBegin(GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(10.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 10.0, 0.0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 0.0, 10.0);
glEnd();

//load texture
QImage img;
if(!img.load(":/files/FloorsCheckerboardSmall.bmp"))
    printf("could not open image");

//try showing texture
glEnable( GL_LIGHTING );
glEnable( GL_COLOR_MATERIAL );
glEnable(GL_TEXTURE_2D);

unsigned int m_textureID;
glGenTextures(1, &m_textureID);
glBindTexture(GL_TEXTURE_2D,m_textureID);
glTexImage2D(GL_TEXTURE_2D,0,(GLint)img.depth(),(GLsizei)img.width(),(GLsizei)img.height(),0,GL_RGB,GL_UNSIGNED_BYTE,img.bits());
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

glColor3d(1.0,0.0,0.0);
glBegin(GL_POLYGON);
    glTexCoord2d(0.0,5.0);
    glVertex2d(0.0,3.0);

    glTexCoord2d(0.0,0.0);
    glVertex2d(0.0,0.0);

    glTexCoord2d(5.0,0.0);
    glVertex2d(3.0,0.0);

    glTexCoord2d(5.0,5.0);
    glVertex2d(3.0,3.0);
    glEnd();
}

编辑1:是否我的纹理太大了?

编辑2:glBindTexture(GL_TEXTURE_2D,m_textureID);放在glColor3d之前而不是之后。

已解决:我的img.depth()返回了无效的internalFormat值。我用有效的internalFormat值GL_RGBA替换了这个GLint。我还将格式从GL_RGB更改为GL_RGBA(请参见genpfaults的答案)。

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,(GLsizei)img.width(),(GLsizei)img.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,img.bits());

在paintGL()顶部的glPushMatrix()对应的glPopMatrix()在哪里? - genpfault
在您的glTexImage2D()调用中,img.depth()是否实际返回1234或任何有效的OpenGL枚举值以供internalFormat使用? - genpfault
我将在代码中添加glPopMatrix,img.depth()返回32。 - stanthecomputerman
好的,深度确实是问题所在。我尝试了一个有效的internalFormat值(1),它起作用了!谢谢!我想给那个评论点赞,但我觉得我的声望不够高xD - stanthecomputerman
你为什么不使用QOpenGLTexture? - peppe
2个回答

4

您需要调用

glBindTexture(GL_TEXTURE_2D,m_textureID); 

在调用glTexImage2D(...)之前,请确保数据的位置已经被OpenGL正确指定,否则OpenGL将无法正确处理您发送的数据。

谢谢回复!我尝试了,但我仍然看不到纹理。它仍然给我定义为glColor3f(1.0,0.0,0.0)的红色,而不是纹理。 - stanthecomputerman
@user3662600:请确保更新问题并附上当前代码状态。 - genpfault
在修改代码后,我发现这也是导致我的问题的原因之一,所以谢谢! - stanthecomputerman

2
                             vvvvvvvvvvvvvvvvvv
glTexImage2D(GL_TEXTURE_2D,0,(GLint)img.depth(),(GLsizei)img.width(),(GLsizei)img.height(),0,GL_RGB,GL_UNSIGNED_BYTE,img.bits());

img.depth() 返回 32

然后你需要传入一个有效的 internalFormat 值,而不是 img.depth()。尝试使用 GL_RGBA

由于 img.bits() 实际上是四个组件,因此您还应将 format 设置为 GL_RGBA


你是对的,仅仅改变了internalFormat后,纹理看起来有点奇怪。通过将格式从GL_RGB改为GL_RGBA,纹理完美地显示出来了。 - stanthecomputerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接