幀緩沖(Framebuffer)


將顏色緩沖,深度緩沖,模板緩沖結合起來,就叫做幀緩沖(存儲在內存中)。

具體創建方法以及用法這里不講,LearnOpenGL對應章節有:幀緩沖

這里說一下容易讓人誤解(或者難以理解)的地方。


  1. 實際上我們平時做的一些操作都是在默認幀緩沖中的渲染緩沖(Renderbuffer)中進行的,這里默認的幀緩沖是在創建窗口的時候GLFW生成和配置的。
  2. 我們可以創建自己的幀緩沖,方便進行一些后期處理操作(不明白的話往下看)。
  3. 幀緩沖至少需要一個顏色附件,附件當中至少要有一個緩沖類型(顏色,深度,模板)。
  4. 顏色附件中的“顏色”指的是附加到幀緩沖的時候的目標類型,注意和附件本身的存儲格式區分開:比方說一個紋理顏色附件,那么創建紋理的時候存儲格式應該為GL_RGB(源圖格式也應該設置為GL_RGB),而附加到幀緩沖上的時候用:GL_COLOR_ATTACHMENT;又比如說一個紋理深度(模板)附件,那么創建紋理的時候就應該將存儲格式改為GL_DEPTH_COMPOENT(GL_STENCIL_INDEX),而附加到幀緩沖的時候用GL_DEPTH_ATTACHMENT(GL_STENCIL_ATTACHMENT)。
  5. 另外一種附件叫做渲染緩沖附件(同紋理附件相對應),渲染緩沖對象直接將所有的渲染數據儲存到它的緩沖中,不會做任何針對紋理格式的轉換,讓它變為一個更快的可寫儲存介質。然而,渲染緩沖對象通常都是只寫的,所以你不能讀取它們(比如使用紋理訪問)。當然你仍然還是能夠使用glReadPixels來讀取它,這會從當前綁定的幀緩沖,而不是附件本身,中返回特定區域的像素。
  6. 一般紋理附件拿來當顏色附件,渲染緩沖附件拿來當 “模板&深度(一個整體)” 附件,同樣,這里的"顏色”“模板&深度”指的都是附加到幀緩沖時候的目標類型。
  7. 那么什么時候選擇紋理附件,什么時候選擇渲染緩沖附件呢?
    通常的規則是,如果你不需要從一個緩沖中采樣數據,那么對這個緩沖使用渲染緩沖對象會是明智的選擇。如果你需要從緩沖中采樣顏色或深度值等數據,那么你應該選擇紋理附件。性能方面它不會產生非常大的影響的。
  8. 需要注意的是,這些附件只是存儲最終結果的,實際渲染過程(深度測試,模板測試之類的)依舊由GLFW自己操作。
  9. 創建自己的幀緩沖有什么用呢?它的優勢是什么呢?
    拿紋理附件(目標類型是顏色緩沖)來說的話,我們可以用圖像的方式訪問已經渲染場景的每個像素,所以可以在fragment shader中做出一些效果,比如說反相,灰度,更進一步,可以結合核(kernel)做出更加有特點的效果:銳化,模糊等。這些操作統稱為后期處理(Post-processing)

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM