2014-03-04 73 views
3

我無法使用OpenGL和Qt將紋理映射到四邊形。我已經看過其他幾個SO線程,但是很多函數調用必須稍微有點不同,以供我編譯(Qt Verison 4.8.6)。這裏是我的相關代碼,現在所發生的只是一個窗口顯示爲黑色背景,但沒有其他。使用OpenGL和QT進行紋理映射 - C++

void LoadGLTextures(const char * name) 
{ 
    QImage img; 

    if(!img.load("resources/Green_Dragon.bmp")){ 
     std::cerr << "ERROR in loading image" << std::endl; 
    } 

    QImage t = QGLWidget::convertToGLFormat(img); 

    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 



void GLWidget::initializeGL() 
{ 


    qglClearColor(qtBlack.dark()); 
    glEnable(GL_CULL_FACE); 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_MULTISAMPLE); 
    static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 }; 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); 
    cameraPos = 0; 
    glEnable(GL_TEXTURE_2D); 
    LoadGLTextures("resources/Green_Dragon.jpeg"); 

} 

void GLWidget::paintGL() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 


    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glShadeModel(GL_FLAT); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glColor3f(0.5, 0.5, 0); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 

    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5f, 0.5f); // vertex 1 
    glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5f, -0.5f); // vertex 2 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, -0.5f); // vertex 3 
    glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.5f); // vertex 4 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 

    glFlush(); 
} 
+0

(PS要傳遞到的文件名'LoadGLTextures'被忽略,不知道這是故意的。 ) –

+0

你怎麼知道文件名被忽略?編輯:沒關係,這是因爲我沒有使用我傳入的變量,杜。 – midma101

+0

我試過你的建議,但那還沒有解決問題,但感謝幫助。 – midma101

回答

4

看着你的評論,現在的答案相當清楚,對不起,我錯過了它的問題評論。

由於您正在啓用深度測試,但您並未清除幀之間的深度緩衝區,所以您看到黑屏。因此,前一幀的深度緩衝區值保持不變,並且所有後續幀的深度測試均失敗(請注意the default depth function is GL_LESS)。

您可以啓用深度測試。正確的解決方案是在每次渲染之前,除了顏色緩衝區之外,還要清除深度緩衝區。您有:

glClear(GL_COLOR_BUFFER_BIT); 

但是,你需要:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

參見:glClear()

+1

雖然我在下面的答案解決了這個問題,但這是真正的答案。謝謝您的幫助! – midma101

0

刪除glEnable(GL_DEPTH_TEST)解決了這個問題,以防萬一有人遇到類似的問題。

+1

哦。 Duh ...對不起,我給了你在問題評論中的週轉,並錯過了你沒有清除深度緩衝區(你不需要禁用深度測試,你只需在清除顏色緩衝區時清除深度緩衝區)。我希望這些評論中至少有一些對其他方面有所幫助。 –