UE4的SSR(屏幕空間反射)是如何實現分攤到多幀渲染的?
從表象來看應該是為了降低每幀在屏幕空間光線追蹤的性能消耗,所以分攤到多幀來實現。下面兩種情況下,即使在持續運動的時候,反射的表現效果仍然很不錯。
1.運動的物體在停下來後,物體的反射會在一段時間慢慢把反射補全。2.相機運動時,物體的反射也會在相機停下來後慢慢補全。
UE4 這個特性不是刻意分幀產生的,而是 Temporal AA 的副產品。
TAA 在運動場景中有非常高的「失敗率」,也就是無法追溯到前幾幀畫面的有效信息。當畫面靜止下來,TAA 命中率就會迅速提高。於是 SSR 也同時享受了超採樣的福利。如果沒有 TAA,UE4 也無法提供如現在你看到這樣的高 SSR 質量,需要融合各種技巧來提升譬如局部環境貼圖什麼的
TAA 其實對於屏幕來說是挺好的技術,一攬子超採樣了幾何,著色,反射。可惜不適用 VR。
類似 stochastic screen space reflection,反射不再是一根反射線,而是一個錐型,錐型頂角根據反射面 BRDF 計算出。為了填補這個錐型所包括的反射圖像,同時為了保證效率僅用較少的反射線,則需要每幀在該反射角範圍內通過隨機分布找出一個隨機反射線,然後用 temporal reprojection 將前幀的結果累積起來。
具體:
1. raytrace pass:第 N 幀,根據 P 點BRDF計算其反射角,根據某種均勻隨機分布(比如 halton)在反射角內找出一個隨機反射線,通過這條線算出反射。
2. temporal reprojection pass:根據第 N 幀的反射,以及第 N - 1 幀的結果,混合出第 N 幀的最終結果。該結果將被用在第 N+1 幀中。
有興趣整合到自己引擎的可以參考:Rendering Monster Hunter Online 第64頁,DX9 也可以用。我們還用到 interleaved sampling,所以需要另外一個 pass 去 de-interleave。
另外:
1. 噪點的問題有很多原因造成,ssr pass 的解析度,temporal filter 的處理,反射面法線精度,場景深度精度等。MHO中有關 SSR 所有計算都是用1/4解析度的(考慮整體效率),所以噪點沒有 DICE 處理的好。同時MHO沒有開啟 motion blur,沒有 motion vector,所以動態物體上的 SSR 最後關閉了。
2. UE 也好,DICE也好,MHO也好,都是用上一幀的畫面去計算反射的,所以100%會有ghost,這個是逃不掉的。
3. UE 所有需要 temporal reprojection 的特效(包括AA,包括他們的 dithered transparency)都共用一個 filter,所以他們的 TXAA 解決所有 reprojection 問題。
TXAA 產生的ghost吧 和前面幾個答主意見一致(逃
我不知道UE怎麼做的。但按道理上可以先用一根ray,再慢慢補充道多跟ray。也可以先用低解析度,在升高。
這就是Temporal AA。每一幀的畫面和上一幀的最終畫面以一定權重混合。在靜止情況下兩幀畫面基本相同,因而上一幀的像素不會在neighbourhood clamping中被clamp掉,所以會迅速收斂。你只需要用隨機數抖動SSR的反射向量和屏幕上的每一個像素就行。
推薦閱讀:
※為什麼知乎上圖形學相關話題大部分是渲染、遊戲、GPU?
※學了哪些知識,計算機圖形學才算入門?
※關於非實感圖形學或者風格化渲染有哪些好的書或者paper?
※軟體渲染器實現Phong Shading的性能優化?
※在基於高度圖的遊戲大世界中該怎麼做動態物體的遮擋剔除比較好呢?