实时全局光照Screen Space Reflection (SSR)
INTRODUCTION
什么是SSR?
基本原理
屏幕空間反射(Screen Space Reflection,SSR),是一個非常著名的基于屏幕空間的技術。由于鏡面反射的波瓣很窄,意味著可以使用少量的光線模擬反射,從而就可以得到不錯的效果。算法本身的原理非常簡單:
- 對于屏幕空間上的物體的每個像素,根據該像素 對應的法線和視線信息,求解出反射向量;
- 當前點沿著反射向量在屏幕空間進行步進,判斷步進后的坐標深度與深度緩存中存儲的物體深度是否相交;
- 若相交,取交點處的物體顏色作為最終的反射顏色;
SSR的兩項基本任務
?
可以觀察到反射是重新利用屏幕空間里的數據。
基本SSR算法-鏡面反射
對于每一幀
- 計算反射光線
- 沿射線方向的軌跡(使用深度緩沖器)
- 用交點的顏色作為反射色
SSR不僅是只能做鏡面反射效果,還可以做glossy材質效果
鏡面效果是將從camera的入射光線與場景中的反射面相交計算得到的反射光線與場景中的物體相交的顏色作為反射的顏色
glossy材質效果是將camre發射的入射光線與反射面相交后得到的lobe上取多個點,將多個點的顏色加權計算得到反射點的顏色。
也還可以做地面不平和地面積水的效果,SSR不要求反射面只能是鏡面,只要知道反射面的法線分布就可以做任何的光線追蹤。
?
實現流程
?如何實現?
目的:尋找反射光線與場景中相交的點
? ? ? ? 對于屏幕空間上的物體的每個像素,根據該像素對應的法線和視線信息,求解出反射向量;沿反射光線方向步進,每一步檢查深度,判斷步進后的深度與深度緩存中存儲的物體深度是否相交;若相交,取交點處的物體顏色作為最終的反射顏色。
SSR的優缺點
優點:
- 針對任何面都可以實時反射,不需要求平面。
- 不需要額外的DrawCall,沒有Planar Reflection那種翻倍DC的問題,計算都在GPU,解放CPU。
- 只需要額外的后處理Pass處理,無需大規模改動引擎管線,容易集成。
- 可以與Reflection Probe等結合使用。
缺點:
- 需要全屏深度和全屏法線,延遲渲染管線中是可以免費拿到的!但是前向渲染的話,需要額外渲染一遍DepthNormalMap。
- Shader中需要進行RayMarching,對于GPU的負載較大,且步進是有一定步長的,它本身不可能非常精確。
- 效果存在自身缺陷,由于只有屏幕可見的物體信息,不在屏幕內的,就完全不會反射。這屬于技術本身的瓶頸。
嚴重的問題:
????????SSR的所有可用信息都是來自屏幕空間,所以有些信息在屏幕空間中并沒有顯示,雖然我們人為地知道這些背后的信息的存在,這會造成SSR的結果會有一些誤差,比如下圖中的手的反射,屏幕空間上只能記錄最外層的數據,不能記錄被遮擋住的手心,所以最后的反射效果并不能顯示手心的信息。
Hi-Z Trace(Hierarchical-Z)算法
Hierarchical-Z緩沖區,也稱為Hi-Z緩沖區,是通過獲取Z-buffer中四個相鄰值得最小值或最大值,將其存儲在原有緩沖區一半大小的緩沖區來構造的。
Hi-Z結構的最小值版本是如何運行的,如下圖所示:
我們都知道,深度可以認為是場景幾何結構的一種表示。
如下圖,這是將Hi-Z各級緩沖反投影到世界空間的可視化結果。
- 可以看出當Hiz的層級越高,就表示這是對場景越粗略的近似。
原文鏈接:https://blog.csdn.net/qjh5606/article/details/120102582
準備工作:將場景中的深度做一個mipmap,但是這個mipmap與平時的不同,之前提到的mipmap是存儲一個圖像金字塔,上層的圖像的像素是下一層的四個像素的平均,而這里的區別是上層像素深度存的是下層像素深度的最小值
?為什么使用深度Mipmap結構?
- 與在3D場景中的BVH,KD-tree類似,使用一種等級策略作為加速結構;
- 能夠快速跳過一些不可能相交的像素點;
- 最小運算保證了一個保守的邏輯:如果一個光線不能與最大的結點相交,name它肯定不能與其任何子節點相交。
如下圖,在最精細的級別,但沒有相交,所以會移動到更粗糙的一層。
如下圖,因為上面沒有相交,所以到了粗糙的一層。因而跳過了許多空白的空間。
???????
如下圖,因為上面還是沒有相交,就會進入下一層。一旦我們找到與 Z 平面的交點,我們就會移動到層次結構中更精細的級別。在這里,我們發生了相交。
因為發生了相交,所以要進入更精細的級別,如下圖。?
?繼續步進,一旦我們在最精確的層級相交,我們就找到了交點。
?Hi-Z通過采用大步長并通過在層次結構級別中索引來達到快速收斂。
參考文章
參考視頻
總結
以上是生活随笔為你收集整理的实时全局光照Screen Space Reflection (SSR)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redfish接口测试
- 下一篇: SQLCODE=-1585