光照故障排除和性能
可使用以下兩種方法之一渲染光照:
__頂點光照__僅計算網(wǎng)格頂點處的光照,并在表面其余部分插入頂點值。頂點光照不支持某些光照效果,但就處理開銷而言,此方法是兩種方法中成本較低的方法。另外,此方法可能是舊顯卡上唯一可用的方法。
__像素光照__是在每個屏幕像素處單獨計算的。雖然渲染速度較慢,但像素光照卻支持一些頂點光照無法實現(xiàn)的效果。僅在使用像素光照的情況下才渲染法線貼圖、光照剪影和實時陰影。此外,在像素模式下渲染時,聚光燈形狀和點光源高光看起來要好得多。

光照對渲染速度有很大影響,因此必須根據(jù)幀率對光照質(zhì)量進(jìn)行折衷。由于像素光照比頂點光照具有更高的渲染開銷,因此 Unity 僅會將最亮光照部分渲染為每像素質(zhì)量,而其余部分渲染為頂點光照。在獨立構(gòu)建目標(biāo)的質(zhì)量設(shè)置 (Quality Settings)?中可設(shè)置像素光照的最大數(shù)量。
您可以使用?Render Mode?屬性將光照渲染模式設(shè)置為像素光照。在決定是否將光照渲染為像素光照時,模式設(shè)置為?Important?的光照將被賦予更高的優(yōu)先級。模式設(shè)置為 __Auto__(默認(rèn)值)后,Unity 將根據(jù)給定對象受光照影響的程度自動對光照進(jìn)行分類。渲染為像素光照的光照是根據(jù)逐個對象確定的。
有關(guān)更多信息,請參閱關(guān)于優(yōu)化圖形性能的頁面。
Lighting 窗口統(tǒng)計信息
Lighting 窗口的底部將提供統(tǒng)計信息,顯示有關(guān)運行時性能的重要指標(biāo)。請參閱有關(guān)?Lighting 窗口的文檔以了解更多詳細(xì)信息。
陰影性能
實時陰影具有相當(dāng)高的渲染開銷,因此應(yīng)謹(jǐn)慎使用它們。任何可能投射陰影的對象都必須首先渲染到陰影貼圖中,然后該貼圖將用于渲染可能接受陰影的對象。與上述的像素/頂點折中相比,啟用陰影對性能的影響甚至更大。
柔和陰影比生硬陰影具有更大的渲染開銷,但這僅影響 GPU,不會導(dǎo)致額外的 CPU 工作。
Quality Settings?包含一個?Shadow Distance?值。與攝像機之間的距離超出此值的對象在渲染時完全沒有陰影。由于通常情況下也不會注意到遠(yuǎn)處物體上的陰影,因此這可作為減少必須渲染的陰影數(shù)量的有用優(yōu)化方案。
方向光的一種特殊問題是單個光照可能會照亮整個場景。此問題意味著陰影貼圖通常會同時覆蓋場景的大部分,這使得陰影容易受到稱為“透視鋸齒”的問題的影響。簡單來說,透視鋸齒是指靠近攝像機的陰影貼圖像素看起來比那些更遠(yuǎn)的像素更“大塊”。雖然可以增加陰影貼圖分辨率以減少此影響,但結(jié)果會造成渲染資源浪費,因為遠(yuǎn)距離區(qū)域的陰影貼圖在較低分辨率下看起來已經(jīng)足夠良好了。
因此,該問題一個很好的解決方案是使用單獨的陰影貼圖:當(dāng)與攝像機之間的距離增加時,陰影貼圖的分辨率降低。這些單獨的貼圖稱為__級聯(lián) (cascade)__。從?Quality Settings?中,可選擇零級、兩級或四級級聯(lián);Unity 將計算攝像機視錐體內(nèi)的級聯(lián)位置。請注意,級聯(lián)僅適用于方向光。請參閱方向光陰影頁面了解詳細(xì)信息。
如何計算陰影貼圖的大小
計算貼圖大小的第一步是確定光照可以照亮的屏幕視圖區(qū)域。方向光可以照亮整個屏幕,但對于聚光燈和點光源,該區(qū)域是光源邊界形狀(點光源為球體,聚光燈為錐體)在屏幕上的投影。投影形狀在屏幕上具有一定的寬度和高度(以像素為單位);然后將這兩個值中的較大者作為光照的“像素大小”。
當(dāng)陰影貼圖分辨率設(shè)置為?High?時(從?Quality Settings?中進(jìn)行設(shè)置),陰影貼圖的大小計算方式如下:
方向光:NextPowerOfTwo?(pixelSize * 1.9),(像素值* 1.9的結(jié)果,然后返回下一個2的冪的值),最大值為 2048。
聚光燈:NextPowerOfTwo?(pixelSize),(像素值,然后返回下一個2的冪的值),最大值為 1024。
點光源:NextPowerOfTwo?(pixelSize * 0.5),(像素值* 0.5的結(jié)果,然后返回下一個2的冪的值),最大值為 512。
如果顯卡有 512MB 或更大的視頻內(nèi)存,方向光的陰影貼圖大小上限增加到 4096,聚光燈為 2048,而點光源為 1024。
陰影分辨率設(shè)置為?Medium?時,陰影貼圖大小是陰影分辨率設(shè)置為?High?時的一半,而分辨率設(shè)置為?Low?時,陰影貼圖大小變?yōu)槠渌姆种弧?/p>
點光源的大小下限比其他類型的大,因為它們對陰影使用立方體貼圖。這意味著此分辨率下的六個立方體貼圖面必須同時保存在視頻內(nèi)存中。渲染它們的成本也非常高,因為潛在的陰影投射物可能需要渲染到所有六個立方體貼圖面中。
陰影故障排除
如果您發(fā)現(xiàn)一個或多個對象未投射陰影,則應(yīng)檢查以下幾點:
舊的圖形硬件可能不支持陰影。請參閱下面可處理陰影的最低硬件規(guī)格列表。
可在?Quality Settings?中禁用陰影。確保啟用了正確的質(zhì)量級別并為該設(shè)置啟用了陰影。
場景中的所有網(wǎng)格渲染器都必須正確設(shè)置相應(yīng)的?Receive Shadows?和?Cast Shadows。默認(rèn)情況下兩者都已啟用,但請檢查確保未意外禁用它們。
只有不透明對象才投射和接受陰影,因此使用內(nèi)置透明著色器或粒子著色器的對象既不會投射也不會接受陰影。通常,您可以使用透明鏤空著色器代替具有“間隙”的對象,例如柵欄、植被等。自定義著色器必須采用像素光照并使用幾何渲染隊列。
使用__頂點光照 (VertexLit)__ 著色器的對象不能接受陰影,但可投射陰影。
使用前向渲染路徑,有些著色器只允許最亮的方向光投射陰影(這種情況尤其發(fā)生在 Unity 4.x 版本的舊版內(nèi)置著色器中)。如果想使用多個陰影投射光,則應(yīng)改用延遲著色 (Deferred Shading)?渲染路徑。您可以使用?
fullforwardshadows
?表面著色器?指令啟用您自己的著色器以支持“全陰影”。
陰影的硬件支持
內(nèi)置陰影幾乎適用于 Unity 支持的所有設(shè)備。每個平臺都支持以下卡:
PC (Windows/Mac/Linux)
通常,所有 GPU 都支持陰影。某些非常舊的 GPU(例如,2005 年制造的 Intel GPU)可能存在例外。
移動端
iPhone 4 不支持陰影。從 iPhone 4S 和 iPad 2 開始的所有后續(xù)型號都支持陰影。
Android:需要 Android 4.0 或更高版本以及?
GL_OES_depth_texture
?支持。最值得注意的是,一些基于 Android Tegra 2/3 的 Android 設(shè)備不符合此要求,因此它們不支持陰影。Windows Phone:僅 DX11-class GPU (Adreno 4xx/5xx) 支持陰影。
游戲主機
所有游戲主機都支持陰影。