2015-10-06 53 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); 
}