Signed Distance Fields in Real-time Rendering

題圖: UE4 Distance Field Ambient Occlusion

Shadow

最基本的製作陰影的方法就是從光源發射射線, 然後判斷著色的點和光源之間是否被物體遮擋, 有遮擋是陰影內, 無遮擋是陰影外. 但是這麼做的結果投射出來的陰影邊緣比較硬. 現實中我們見到的陰影都會有柔和的半影區, 如下面兩個圖所示:

HardShadow

SoftShadow

使用SDF做柔和陰影具有先天優勢, 因為場景內的距離信息全都有. 上圖的做法就是計算每個著色點距離本影的距離, 如果接近, 那麼就計算一個跟距離有關的衰減作為半影的值去模擬柔和陰影. 現在回頭看看利用SDF計算陰影的方法, 我們很容易聯想到, 這方法類似計算環境遮蔽啊, 所以, SDF當然可以用來計算AO.

Ambient Occlusion

AO是Crytek[1]發揚光大的. 我們可以在碰撞點周圍隨機採樣位置信息, 距離碰撞點在一定範圍內, 算作AO的權重加權:

AO Only

目前為止, 我們的渲染對象都是簡單的幾何體, 可以使用公式描述, 但是如果想要更進一步使用SDF的話, 比如在遊戲內, 我們需要面對更複雜的幾何體, 可能無法用公式描述, 怎麼辦呢? 因此我們需要把這些複雜物體映射成SDF.

Create SDF

Evans[2]提出一種方法: 使用立體貼圖存儲SDF. 後來UE4的Mesh Distance Field[3]也使用了類似的方法. 但是兩者的都有一個主要的缺點就是比較耗內存. 後者把這個技術限制在DX11或更高的API特性才能使用, 並且只能用在等比縮放的靜態物體上.

Evans的方法是用OBB分多個切片, 然後切片和物體相交算SDF.

Evans, 2006.

如果是簡單的物體, 可以實時算, 複雜的話可以離線算好實時渲染時使用. 另外一種變通方法是使用立體網格每一個網格去採樣目標物體的三角面, 尋找距離最近的三角面做SDF. 這種方法首先需要存儲立體貼圖比較耗內存, 其次是目標物體越複雜這個演算法就越耗時, 目前我還沒有去看UE4的實現, 但是根據使用方式猜測是這種方法.

作為測試和演示, 我採用的方法是把3d信息平鋪到2d貼圖上:

採用2D平鋪模擬3D texture

SDF Visualization

SSS

這裡使用的方法基於Simon Green[4]使用depth map快速模擬SSS。

截圖來自 Real-Time Approximations to Subsurface Scattering

利用SDF進行簡單的SSS

可以使用魔參調整通透度


[1] Mittring, M., Finding Next Gen CryENGINE? 2, 2007.

[2] Alex Evans, Fast Approximations for Global Illumination on Dynamic Scenes, 2006.

[3] Daniel Wright, Dynamic Occlusion With Signed Distance Field, 2015.

[4] Simon Green, Real-Time Approximations to Subsurface Scattering, 2004.


推薦閱讀:

Ray Marching 101

TAG:計算機圖形學 | 實時渲染 | 光線跟蹤 |