【问题标题】:OpenGL Texture doesn't showOpenGL 纹理不显示
【发布时间】:2014-07-10 17:42:24
【问题描述】:

我正在尝试使用 opengl 在 Qt 中显示纹理,但它只是在我运行时不显示纹理。

我做了一些研究,发现我需要将纹理的高度和宽度设为 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();
}

EDIT1:会不会是我的纹理太大了?

EDIT2: glBindTexture(GL_TEXTURE_2D,m_textureID);放置在 glBindTexture 之前而不是 glColor3d 之前

已解决:我的 img.depth() 返回了无效的 internalFormat 值。我用有效的 interalFormat 值 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()在哪里?
  • 在您的glTexImage2D() 调用中,img.depth() 是否实际返回1234internalFormat 的任何有效OpenGL 枚举值?
  • 我将 glPopMatrix 添加到代码中,img.depth() 返回 32。
  • 好吧,深度确实是个问题。我尝试了一个有效的 internalFormat 值 (1),它成功了!谢谢!我想对这个评论竖起大拇指,但我认为我的声誉不够高 xD
  • 你为什么不用QOpenGLTexture?

标签: c++ qt opengl textures


【解决方案1】:
                             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

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

【讨论】:

  • 你说得对,只是更改了 internalFormat 后,纹理看起来有点奇怪。通过将格式从 GL_RGB 更改为 GL_RGBA,纹理显示完美
【解决方案2】:

你必须打电话

glBindTexture(GL_TEXTURE_2D,m_textureID); 

在调用 glTexImage2D(...) 之前。否则 OpenGL 将不知道您发送的数据属于何处。

【讨论】:

  • 感谢您的回复!我试过了,但我仍然看不到纹理。它仍然给我 glColor3f(1.0, 0.0, 0.0); 定义的红色。而不是纹理。
  • @user3662600:确保使用代码的当前状态更新问题。
  • 修改代码后,我发现这也是导致我的问题的原因之一,所以谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多