1. 程式人生 > 其它 >【Qt】glBindFramebuffer(GL_FRAMEBUFFER, 0) 導致螢幕空白的問題

【Qt】glBindFramebuffer(GL_FRAMEBUFFER, 0) 導致螢幕空白的問題

最近正在使用Qt的QOpenGLWidget來學習opengl,前期進展十分順利,直到我遇到了framebuffer這一章節
framebuffer的大致使用方式如下:

// 第一處理階段(Pass)
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 我們現在不使用模板緩衝
glEnable(GL_DEPTH_TEST);
DrawScene();    

// 第二處理階段
glBindFramebuffer(GL_FRAMEBUFFER, 0); // 返回預設
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT);

screenShader.use();  
glBindVertexArray(quadVAO);
glDisable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, textureColorbuffer);
glDrawArrays(GL_TRIANGLES, 0, 6);  

程式很簡單,但是當我執行之後,發現螢幕全白,即對應glClearColor(1.0f, 1.0f, 1.0f, 1.0f),為了驗證我這個猜想,我進行了以下步驟:

  • 螢幕全白是不是真的對應到glClearColor這個函式。修改清屏顏色,發現執行後的螢幕顏色確實和其一一對應。
  • 有沒有真的把三角形繪製上去。把glDrawArrays(GL_TRIANGLES, 0, 6)刪除後,發現並不影響螢幕全白這一結果,因此問題應該出現在glClearColor(1.0f, 1.0f, 1.0f, 1.0f)之前。
  • 刪除第二處理階段的這幾行函式,發現螢幕變黑,對應glClearColor(0.1f, 0.1f, 0.1f, 1.0f)
    ,再把glBindFramebuffer(GL_FRAMEBUFFER, framebuffer)註釋掉,讓物體不繪製在幀緩衝內,而是直接繪製到當前螢幕上,嘿,沒問題!

那……問題應該是出現在幀緩衝繫結上?我們是否真的繫結到了幀緩衝區呢?
stackoverflow搜尋一波:
OpenGL Qt : problem using framebuffers for bloom effect
OpenGL does not render to screen by calling glBindFramebuffer(GL_FRAMEBUFFER,0)
Easiest way for offscreen rendering with QOpenGLWidget

果真是緩衝區繫結的問題!當我們執行glBindFramebuffer(GL_FRAMEBUFFER, 0)時,我們並沒有返回到Qt預設的幀緩衝,應該先呼叫QOpenGLContext::defaultFramebufferObject()這個函式得到Qt預設的幀緩衝,即需要這麼改:
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());