OpenGL——理解延遲着色法(上篇)

本文檔只是學習心得,系統學習請參考原文。

之前看Unity的文檔的時候,經常看到正向渲染和延遲渲染這樣高大上的名詞,然後看了一下文檔,依舊保持一臉懵逼的狀態。

直到我學習了這篇之後,才真正理解了延遲渲染的意義和存在價值。

Q1:正向渲染的缺陷是什麼?
大部分片段着色器輸出,都會被之後的輸出覆蓋,浪費了大量資源。而且場景越複雜,光源越多,這種浪費越嚴重。

Q2:延遲着色延遲的是那一部分?
延遲的是複雜的光照部分。也就是片段着色器的部分。

Q3:延遲着色發的原理是什麼?
把幾何處理階段的數據,存到G-Buffer中去,然後像類似後期處理一樣的方式,去利用G-Buffer中的數據去計算光照
OpenGL並沒有限制我們往顏色緩存裏面存放什麼數據,這是延遲着色法得以實現的大前提。

Q4:延遲着色發算是後期處理的一種嗎?
原則上不是。
雖然有相似之處,比如,想把數據寫入到Buffer中去,然後在一張Quad(四個頂點組成的平面)上計算最終結果。
但是,延遲渲染中的G-Buffer中的數據,並不是最終結果,他只是整個渲染過程的一部分,只有加上延遲着色的那部分,纔算完成了一個完整的渲染過程。

Q5:延遲着色法有哪些缺點?
需要消耗大量緩存。
不能處理顏色混合。
迫使你對大部分場景使用相同的光照算法,雖然可以通過包含跟多關於材質的數據來減緩這一缺陷,但是也意味着會消耗更多的顯存。

Q6:延遲着色爲什麼會消耗大量緩存?
因爲我們要把大量數據存放到G-Buffer中,比如:頂點數據,法線向量數據,顏色數據,鏡面反射係數數據等等。
初次之外,還要傳入觀察點位置和光源數據,當然,這些是可以忽略不計的。

Q7:延遲着色法爲什麼不支持顏色混合。
因爲G緩衝中所有的數據都是從一個單獨的片段中來的,也就是最前面的片段,而混合需要依賴當前片段和之前的片段進行計算操作(注意:在處理G緩衝的時候,實質上的片段操作還木有開始,下圖中的G-Buffer.fs本質上是填充G-Buffer的過程,而不是在計算片段。)

下圖是我對延遲着色發的過程的理解,這張圖不包含通過前向着色法結合延遲着色法進行統一渲染的流程,那將是另一篇心得的內容。
第一組Shader,用來填充G-Buffer。
第二組Shader,用來通過G-Buffer中的數據來計算複雜的光照
第三組Shader,用來渲染光源,因爲光源通常不參與光照計算,所以要單獨提取出來渲染。

結合原文對應的例子代碼,看這張圖效果會更好!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章