OpenGL 學習筆記 幀緩衝與後期處理

2021-08-09 13:10:56 字數 2113 閱讀 4796

原文對應:learnopengl cn-高階opengl-幀緩衝。

預設緩衝幀與幀緩衝:

因為計算本身是消耗時間的,所以如果不採用雙緩衝,則會出現影象閃爍的現象,有了雙緩衝之後,顯示前緩衝區,在後緩衝區繪圖。然後交替交換顯示,只要有乙個拷貝的過程,就可以完成繪圖。

這個後緩衝區,就是opengl(或者dx也是一樣)的預設緩衝區。諸如深度測試,模板測試,顏色混合這些,成果通過測試,保留的字段(或者顏色混合得到的結果)都是預設寫到這個緩衝區裡面的。所謂的通過測試的片段,說白了就是寫到這個後緩衝區裡,並等待交換並顯示於顯示裝置。

我對幀緩衝的理解是:為了執行某些特殊操作,實現某些特殊效果,在片段程式和後緩衝之間,增加了乙個中間層,這個層就是幀緩衝。

比如後期效果,之前沒有系統學習opengl之前(其實看過一些書,不過比較坑,沒有這系列文章寫得如此開卷有益,看著看著就迷糊了,看完一遍跟沒看一樣)我並不了解,諸如模糊效果是怎麼實現的,為什麼後期處理比較費。

為什麼後期效果需要用到幀緩衝

即便不看幀緩衝這篇文章,單純從已有的知識結構去思考。

如果不用幀緩衝,我們怎麼獲取,計算模糊效果所必須的,乙個畫素點周圍的點?

由於gpu的計算都是並行的,所以在你計算a點的時候,你怎麼保證a點周圍的8個點都已經計算完了?這是不可能做到的。

如果你不用幀緩衝,直接在後緩衝區計算模糊效果,那麼當你計算a-1這個點時,就會把包含a在內的八個鄰接點全部汙染掉。

--------------------------舉個栗子-------------------------------

1 1 1 

你期望的結果是 中間的點是左右點的加和,也就是

1 2 1

好,那麼是個點呢?

1111,你期望的結果是,1221

然而實際結果呢?一定不是1221

而是:1 2 3 1

資料被汙染了,算2號點的時候,用的是1,3點,而算3號點的時候,用的是2,4號點。

但是如果有幀緩衝,結果就不一樣了。我們先用幀緩衝,將場景全部渲染到一張和螢幕等大小的貼圖上

1111

而目標,也就是最終渲染目標是,預設的緩衝區

我們先從幀緩衝區取1,3計算2號位 得到2,寫到預設緩衝區

我們先從幀緩衝區取2,43計算3號位 得到2,寫到預設緩衝區

最後結果是1 2 2 1,就是我們想要的結果(假定不考慮邊界值的計算)

這就是幀緩衝區的作用

這就是為什麼實現後期效果,需要用到幀緩衝的原因。

理解幀緩衝

幀緩衝,某些特性和zbuffer,模板緩衝很像。

比如:操作過程都分為兩個部分:創作部分,和應用部分。

像:模板緩衝

創作部分:將模型寫進去,製作遮罩模板

使用部分:利用遮罩模板,遮蔽掉某些片段,製作類似於描邊,透明遮罩等效果

又如:深度測試

創作部分:就是先繪製的圖形,他們會將深度寫入zbuffer

使用部分:使用部分其實是和創作部分重合的,後寫入的點要和zbuffer的預設值,或者是前輩們寫入的值比較,決定淘汰前輩,或者被前輩淘汰。

再看幀緩衝,也分創作部分和使用部分

創作部分:利用某些東西,比如,不包含ui在內的所有3d場景部分,寫入幀緩衝——寫入目標是乙個texture目標。

使用部分:利用已經寫入的東西,進行後期處理,比如模糊處理。

(然後在正常的寫入清晰的ui部分,這樣,場景模糊,ui不模糊的需求,就完成了。)

但是幀緩衝也有特殊的地方:

我們不產生畫素,深度,或者模板,我們只是畫素,深度,模板緩衝的搬運工……………………………………

好吧,我很無聊。

幀緩衝本身並無意義,必須為他們繫結上述三種的一種。他就像乙個容器,乙個殼一樣,空容器,是沒卵用的。

幀緩衝搬運的東西,叫做附件。

附件有兩種:

可以把兩種附件繫結到乙個幀緩衝區上面去,這有點像是建立了乙個額外的渲染流程(的一部分,從片段,到寫入緩衝區這一部分)。這個過程就是所謂離屏渲染(off-screen rendering)。

至於「每個緩衝都應該有相同的樣本數」我對這句話暫時的理解是,兩個附件緩衝區的長寬應該是一直的,也就是持有畫素數量相等。

opengl學習筆記 雙緩衝與融合技術

今天看了看opengl的融合技術,聯絡前一段時間老師讓我改的乙個用他自己的框架實現的3d物體透明融合的程式,感覺到老師說的思路,不可以實現。因為三維的透明物體,簡單的使用融合功能和融合因子是不夠的,三維物體有遠近,因此三維物體的繪製過程是利用的是深度緩衝技術。這樣的話,對於繪製透明物體與不透明物體,...

OpenGL建立乙個幀緩衝

1.定義幀緩衝變數名 unsigned int gbuffer 2.建立幀緩衝 glgenframebuffers 1,gbuffer 3.將幀緩衝繫結到gl framebuffer glbindframebuffer gl framebuffer,gbuffer 4.將gposition紋理變數儲...

高階OpenGL渲染管線之幀緩衝(三)

幀緩衝包括之前學的 用於寫入顏色值的顏色緩衝 用於寫入深度資訊的深度緩衝和允許我們根據一些條件對齊特定片段的模板緩衝。他們都儲存在記憶體中,我們也可以定義自己的幀緩衝。在繫結到gl framebuffer目標之後,所有的讀取和寫入幀緩衝的操作將會影響當前繫結的幀緩衝。我們也可以使用gl read f...