前向渲染和延遲渲染是兩種光照渲染模式。
假設有1個光源和1000個具有光照反射的三角形在view coordinate沿着z軸正方形延伸擺放,法線與z軸平行,即所有三角形xy全相同,只有z不同,但是這里增加一個條件:擺放順序是無序的。
從屏幕上其實你只能看到一個帶光照的三角形,其他的都被擋住了。
那么前向渲染會這樣做:
- 遍歷1000個三角形片元
- 進行深度檢測,沒通過的忽略
- 通過檢測的進行光照計算
- 更新幀緩沖區
- 返回1繼續直到遍歷結束
由於上面的要求是無序擺放,那么如果運氣差一點 1000次深度檢測全部都能通過,那么光照會計算1000次,可是因為只能看見最上面的,那么999次光照計算都是多余的。如果光源越多第三步的重復次數越多,整體復雜度也會越高。
延遲渲染引入了GBuffer,它會這樣做:
- 遍歷1000個三角形片元
- 進行深度檢測,沒通過的忽略
- 通過的將坐標、光照等信息寫入GBuffer
- 返回1繼續直到遍歷結束
- 遍歷Gbuffer
- 利用Gbuffer中的數據進行光照計算
- 更新幀緩沖區
- 返回5繼續直到遍歷結束
延遲渲染先把可以顯示在屏幕上的像素點的相關參數保存下來,然后只進行了一次光照計算就實現了最終效果。這樣大大節約了光照計算復雜度。每增加一個光源,只會增加一次整體的光照計算。所以延遲渲染的好處顯而易見了。
然而,世間無完美之事,GBuffer只能給屏幕上的每一個點保存一份光照數據,但是如果這些三角形都是半透明的怎么辦?
無解–# Blend已廢。
由於Gbuffer存的都是像素值,無法體現出每個像素對應的原始模型,那么多重采樣抗鋸齒功能也無法實現。三角形可能還好點,畫圓就悲劇了。
所以如果各位大哥對Blend混合和抗鋸齒有要求,那么Gbuffer可能就不太適合了。
