陰影
Unity 的光源可將游戲?qū)ο蟮腳_陰影__投射到其自身的其他部分或其他附近的游戲?qū)ο笊?。陰影為場景添加了一定程度的深度和真實感,因為它們可以顯示游戲?qū)ο蟮谋壤臀恢?,否則游戲?qū)ο罂雌饋盹@得扁平。

陰影的工作原理
考慮只有一個光源的簡單場景。光線從該光源發(fā)出后以直線傳播,最終可能會照射到場景中的游戲?qū)ο?。一旦光線照射到某個游戲?qū)ο?,它就無法再進(jìn)一步照亮其他任何對象(也就是說,光線會從第一個游戲?qū)ο蟆胺磸棥倍皇侵苯油ㄟ^)。游戲?qū)ο笸渡涞年幱熬褪俏幢徽樟恋膮^(qū)域,因為光線無法到達(dá)這些區(qū)域。

另一種看待陰影的方式是設(shè)想將攝像機(jī)置于與光源相同的位置。場景中陰影區(qū)域恰好是攝像機(jī)無法看到的區(qū)域。

事實上,這正是 Unity 從光源位置確定陰影位置的方法。光源使用與攝像機(jī)相同的原理在內(nèi)部從其視角“渲染”場景。場景攝像機(jī)使用的深度緩沖系統(tǒng)可跟蹤最接近光的表面;位于直接視線中的表面將接受光照,而所有其他表面都處于陰影中。在這種情況下,深度貼圖稱為__陰影貼圖__(可參閱?Wikipedia 頁面了解有關(guān)陰影貼圖的更多有用信息)。
啟用陰影
使用 Inspector 中的?Shadow Type?屬性可為單個光源啟用和定義陰影。

屬性:????????????????????????????????????????????????????????????????????????????功能:
Shadow TypeHard ????Shadows?設(shè)置會產(chǎn)生銳邊的陰影。與?Soft Shadows?相比,生硬陰影 (Hard Shadows) 不是特別逼真,但涉及的處理工作較少,并且在許多使用場合中是可接受的。此外,柔和陰影 (Soft Shadows) 往往還會減少陰影貼圖中的“塊狀”鋸齒效果。
Strength????????此設(shè)置決定了陰影的暗度。通常,一些光會被大氣散射并在其他游戲?qū)ο笊习l(fā)生反射,因此通常不希望將陰影設(shè)置為最大強(qiáng)度。
Resolution????????此設(shè)置將設(shè)置上述陰影貼圖的“攝像機(jī)”的渲染分辨率。如果陰影具有非常明顯的邊緣,則可能需要增大此值。
Bias????????使用此設(shè)置可微調(diào)陰影的位置和定義。請參閱下面的陰影貼圖和 Bias 屬性以了解更多信息。
Normal Bias????????使用此設(shè)置可微調(diào)陰影的位置和定義。請參閱下面的陰影貼圖和 Bias 屬性以了解更多信息。
Shadow Near Plane????????通過此設(shè)置可以在渲染陰影時選擇近平面的值。如果游戲?qū)ο笈c光源之間的距離小于此值,則不會投射任何陰影。
場景中的每個網(wǎng)格渲染器 (Mesh Renderer)?還具有?Cast Shadows?和?Receive Shadows?屬性,必須根據(jù)需要啟用它們。

通過從下拉菜單中選擇?On?啟用?Cast Shadows__,即可啟用或禁用網(wǎng)格的陰影投射?;蛘撸x擇?Two Sided__ 以允許表面的任一面投射陰影(因此在進(jìn)行陰影投射時會忽略背面剔除),或選擇?Shadows Only?以允許不可見的游戲?qū)ο笸渡潢幱啊?/p>
陰影貼圖和 Bias 屬性
給定光源的陰影是在最終場景渲染期間確定的。當(dāng)場景渲染到主攝像機(jī)視圖時,視圖中的每個像素位置都將轉(zhuǎn)換為光源的坐標(biāo)系。然后,像素與光源的距離將與陰影貼圖中的對應(yīng)像素進(jìn)行比較。如果像素比陰影貼圖像素更遠(yuǎn),那么它很可能被另一個游戲?qū)ο笳趽踝」饩€,因此不會獲得光照。

直接獲得光照的表面有時看起來部分處于陰影中。之所以出現(xiàn)這種情況,是因為應(yīng)該精確位于陰影貼圖中指定距離處的像素有時被計算為更遠(yuǎn)距離(這是對陰影貼圖使用陰影過濾或低分辨率圖像的結(jié)果)。造成的結(jié)果是陰影中出現(xiàn)任意像素圖案(這些像素其實應(yīng)當(dāng)獲得光照),帶來稱為“陰影暗斑”(shadow acne) 的視覺效果。

為了防止陰影暗斑,可在陰影貼圖中的距離上添加?Bias?值,從而確保邊線上的像素確實符合比較預(yù)期,或者確保在渲染到陰影貼圖時游戲?qū)ο罂梢匝刂陨矸ň€插入一點點。啟用陰影后,這些值由?Light?Inspector 窗口中的?Bias?和?Normal Bias?屬性設(shè)定。
不要將?Bias?值設(shè)置得太高,因為游戲?qū)ο蟾浇年幱爸車鷧^(qū)域有時會被錯誤地照亮。這會導(dǎo)致陰影脫離游戲?qū)ο?,使游戲?qū)ο罂雌饋砗孟耧h在地面上方。

同樣,將?Normal Bias?值設(shè)置得太高會使陰影對于游戲?qū)ο髞碚f太窄:

在某些情況下,__Normal Bias__ 會導(dǎo)致稱為“光滲”(light bleeding) 的不良效果,這種情況下,光線從附近的幾何體滲透到應(yīng)該產(chǎn)生陰影的區(qū)域。一種可能的解決方案是打開游戲?qū)ο蟮木W(wǎng)格渲染器,并將?Cast Shadows?屬性更改為?Two Sided。這種做法有時會有所幫助,但可能會占用更多資源,并在渲染場景時增加性能開銷。
光源的 Bias 值可能需要適當(dāng)調(diào)整以免產(chǎn)生不想要的效果。通常用眼睛衡量正確值會更簡單,而不是試圖計算該值。
為了進(jìn)一步防止陰影暗斑,我們采用一種稱為陰影平墜?(Shadow pancaking) 的技術(shù)(請參閱方向光陰影:陰影平墜)。這種技術(shù)通常很有效,但對于非常大的三角形可能帶來視覺瑕疵。

調(diào)整?Shadow Near Plane Offset?屬性可解決此問題。將此值設(shè)置得太高會引入陰影暗斑。
