前向渲染和延遲渲染的區別


前向渲染和延遲渲染是兩種光照渲染模式。

假設有1個光源和1000個具有光照反射的三角形在view coordinate沿着z軸正方形延伸擺放,法線與z軸平行,即所有三角形xy全相同,只有z不同,但是這里增加一個條件:擺放順序是無序的。

從屏幕上其實你只能看到一個帶光照的三角形,其他的都被擋住了。

那么前向渲染會這樣做:

  1. 遍歷1000個三角形片元
  2. 進行深度檢測,沒通過的忽略
  3. 通過檢測的進行光照計算
  4. 更新幀緩沖區
  5. 返回1繼續直到遍歷結束

由於上面的要求是無序擺放,那么如果運氣差一點 1000次深度檢測全部都能通過,那么光照會計算1000次,可是因為只能看見最上面的,那么999次光照計算都是多余的。如果光源越多第三步的重復次數越多,整體復雜度也會越高。

延遲渲染引入了GBuffer,它會這樣做:

  1. 遍歷1000個三角形片元
  2. 進行深度檢測,沒通過的忽略
  3. 通過的將坐標、光照等信息寫入GBuffer
  4. 返回1繼續直到遍歷結束
  5. 遍歷Gbuffer
  6. 利用Gbuffer中的數據進行光照計算
  7. 更新幀緩沖區
  8. 返回5繼續直到遍歷結束

延遲渲染先把可以顯示在屏幕上的像素點的相關參數保存下來,然后只進行了一次光照計算就實現了最終效果。這樣大大節約了光照計算復雜度。每增加一個光源,只會增加一次整體的光照計算。所以延遲渲染的好處顯而易見了。

然而,世間無完美之事,GBuffer只能給屏幕上的每一個點保存一份光照數據,但是如果這些三角形都是半透明的怎么辦?

無解–# Blend已廢。

由於Gbuffer存的都是像素值,無法體現出每個像素對應的原始模型,那么多重采樣抗鋸齒功能也無法實現。三角形可能還好點,畫圓就悲劇了。

所以如果各位大哥對Blend混合和抗鋸齒有要求,那么Gbuffer可能就不太適合了。


免責聲明!

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



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