【Qt】glBindFramebuffer(GL_FRAMEBUFFER, 0) 導致螢幕空白的問題
阿新 • • 發佈:2021-08-12
最近正在使用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());