2015-10-06 52 views
1

我正在使用Qt创建一个简单的Sprite编辑器与OpenGL,但图像只是不显示,它只是一个白色的四边形在屏幕上。Qt OpenGL纹理将不会出现

我检查了我的代码,我认为一切正常。四是图像的尺寸相同,并纹理ID不为0

这里是我的代码:

初始化:

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glDisable(GL_CULL_FACE); 

glViewport(0, 0, width, height); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, win_width, win_height, 0, -1, 1); 
glMatrixMode(GL_MODELVIEW); 

纹理加载:

QImage b = QImage(filename); 
m_texture = QGLWidget::convertToGLFormat(b); 

glGenTextures(1, &m_id); 
glBindTexture(GL_TEXTURE_2D, m_id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

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

渲染:

glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glBindTexture(GL_TEXTURE_2D, m_id); 

glBegin(GL_QUADS); 

glTexCoord2f(0.0f, 0.0f); 
glVertex2i(0, 0); 

glTexCoord2f(1.0f, 0.0f); 
glVertex2i(m_texture.width(), 0); 

glTexCoord2f(1.0f, 1.0f); 
glVertex2i(m_texture.width(), m_texture.height()); 

glTexCoord2f(0.0f, 1.0f); 
glVertex2i(0, m_texture.height()); 

glEnd(); 

glBindTexture(GL_TEXTURE_2D, 0); 

这就是我到目前为止: White Quad

+0

仍然不能工作! – dcubix

+1

打印opengl版本时会说些什么?即glGetString(GL_VERSION)和glGetString(GL_SHADING_LANGUAGE_VERSION) – faraza

+0

@faraza 'Version:2.1.0 - Build 8.15.10.2900' '底纹语言版本:1.20 - 英特尔生成8.15.10.2900' – dcubix

回答

0

尝试手动将OpenGL版本设置为3.2。

QGLFormat glFormat; 
glFormat.setVersion(3, 2); 
glFormat.setProfile(QGLFormat::CoreProfile); 
QGLFormat::setDefaultFormat(glFormat); 

当你这样做后,用glGetString()打印你的OpenGL版本。

如果你仍然得到2.1,你没有在正确的OpenGL上下文中设置它。我不确定您是如何制作OpenGL调用的,但我使用的是QT Creator Designer,并在主窗口中嵌入了QGLWidget。所以我成功地通过设置OpenGL版本在MainWindow构造函数中设置它

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    QGLFormat glFormat; 
    glFormat.setVersion(3, 2); 
    glFormat.setProfile(QGLFormat::CoreProfile); 
    QGLFormat::setDefaultFormat(glFormat); 
    ui->setupUi(this); 
}