基於物理的景深效果

景深效果[3]是由於鏡頭焦距的不同導致鏡頭對不同距離的光的折射不同而出現的一種現象,在攝影中是種常見的藝術表達方式.

在渲染領域為了模擬這種效果,出現了很多模擬方法[5].時至今日,斗轉星移,今天我們來看看在遊戲圈兩大主流引擎的Post Process DoF是如何實現的.先來看看Unity官方寫的PostProcess[7]:

Unity使用了基於物理鏡頭的參數來控制DoF,我們可以看到他的介面:

裡面包含了焦距和光圈級數[1]的設置.從shader中可以看出,Unity算CoC[2]的公式是:

並且使用了35mm全畫幅相機的格式.但是Unity這個公式做了改變,加入了一個玄學值來計算最大CoC半徑,所以這一點讓我覺得"I cant understand math, I just get used to it.".

接下來我們看看UnrealEngine 4(UE4[8]),它的DoF分了3種,分別是:

遊戲內推薦使用Gaussian DoF, 同時也是最常規的一種做法.它計算CoC的公式是:

它的用戶介面是醬紫的:

除了提供一些基於物理的介面,同時也提供了一些方便美術調整的參數.順便值得一提的是,UE4針對遊戲中DoF常見的articfact,提供了一種解決方法.常規做法都會遇到下圖的問題:

UE4使用了被稱作Adaptive DoF的技術:

近景的角色頭周圍的模糊artifact都消除了.對這個技術感興趣可以參看UE4源碼.

可以看到,即使是基於物理,目前仍然需要在公式中插入一些玄學值(基於經驗)來達到可控可調的效果.所以實現一個完全基於物理的系統,是不是必要呢?不是每一個人都希望在控制遊戲鏡頭前都先學一下攝影.

[1]f-number

[2]Circle of confusion

[3]Depth of field

[4]Zeiss formula

[5]Depth of Field: A Survey of Techniques

[6]Focal length

[7]Unity-Technologies,PostProcessing-Stack v2

[8]UE4,Depth of Field


推薦閱讀:

手游內存佔用過高?如何快速定位手游內存問題
從零開始學基於ARKit的Unity3d遊戲開發系列2
Unity3D熱更新LuaFramework入門實戰(3)——編寫Lua邏輯
【Unity】工具類系列教程——對象池!

TAG:计算机图形学 | UnrealEngine4 | Unity游戏引擎 |