Screen Space Reflection特定角度顯示錯誤問題?

上接Screen Space Reflection 間接光問題? - 編程

修改了一些Bug後(紋理矩陣多球了一次轉置 @叛逆者),在近平面的角度下,能顯示比較正確的SSR結果

但是隨著相機視角變換,SSR的結果就嚴重扭曲。。而且有的部分甚至就直接缺失了

=============================

這是因為SSR本身的缺陷還是有什麼細節沒注意么?該怎麼彌補修改這種錯誤呢?

希望大神解答,感激不盡。


這是必然的啊,SSR也是SS,只能反射到你看得見的pixel,攝像機一轉,有些pixel看不到了,自然沒得SSR。


強答,最近也在看ssr,其實說得很清楚了局部反射, 在ss外的肯定是反射不到了。全方向的反射在dx11龍書上有基於GS的例子。題主可以試一下cubemap和ssr的結合,看了龔大在opengpu上的

採用ssr的反射更加真實。

單獨使用ssr在有些場景下並不適合。 但是,腦補下,一個狹小室內空間地上有一灘水, 水的反射用ssr就很足夠了。

為什麼產生變形?

看了題主幾張出現變形的圖,都是在視角低,ssr能採樣到的數據偏少的情況,就上圖來看,反射的一部分是正常的,而出現問題的部分其實是ssr已經無法採樣到的


你變形的地方應該沒有反射圖像,因為那個地方的反射圖像在屏幕外。見上圖,紅線下的部分(你的扭曲部分)應該沒有反射圖像。

你在做 ray trace 的時候要檢查一下你的 ray 在屏幕空間位置(如果用 Morgan McGurie 的那套,ray 應該就是屏幕空間的)。如果 ray 的 X 或 Y 超出屏幕範圍了,就停止 trace。


題主似乎用的是Morgan McGurie的Efficient SSR方法?

我在實現時也遇到過類似的問題,最後發現是他給的示例代碼要求投影矩陣變換到pxiel coordinate而非clip space,所以需要手動將P0和P1從NDC變換到像素坐標。

另外,zThickness不要設的太大,並且要提前終止一些已經處於屏幕空間外的射線。


看不見地方反射還要配合CubeMap來做


推薦閱讀:

對HDR、SSAO這樣的post effect應該用什麼樣的抗鋸齒技術?
為什麼directX里表示三維坐標要建一個4*4的矩陣?
[初步結論]DX12強制加入的A卡特性ACE非同步計算是否是為彌補GCN效率低的缺陷?
shader 一個pass計算多個光源如何實現?
國內外哪些學校的計算機圖形學比較強?

TAG:計算機圖形學 | DirectX | 錯誤問題 |