Unity-前向渲染路徑
本頁面將介紹 Unity 內(nèi)置渲染管線中的前向渲染路徑。
前向渲染根據(jù)影響對象的光源在一個或多個通道中渲染每個對象。光源本身也可以通過前向渲染進行不同的處理,具體取決于它們的設置和強度。
實現(xiàn)詳細信息
在前向渲染中,影響每個對象的一些最亮的光源以完全逐像素光照模式渲染。然后,最多 4 個點光源采用每頂點計算方式。其他光源以球諧函數(shù) (SH) 計算,這種計算方式會快得多,但僅得到近似值。光源是否為每像素光源根據(jù)以下原則而定:
Render Mode 設置為?Not Important?的光源始終為每頂點或 SH 光源。
最亮的方向光始終為每像素光源。
Render Mode 設置為?Important?的光源始終為每像素光源。
如果上述情況導致光源數(shù)少于當前的?Pixel Light Count?質(zhì)量設置,則按照亮度降低的順序,更多光源采用每像素渲染方式。
每個對象的渲染按如下方式進行:
基礎通道應用一個每像素方向光和所有每頂點/SH 光源。
其他每像素光源在額外的通道中渲染(每個光源對應一個通道)。
例如,如果某個對象受到許多光源的影響(下圖中的圓形受光源 A 到 H 的影響):

讓我們假設光源 A 到 H 具有相同的顏色和強度,并且所有光源都具有自動渲染模式,因此它們將嚴格按照此對象的以下順序排序。最亮的光源將以每像素光照模式渲染(A 到 D),然后最多 4 個光源以每頂點光照模式渲染(D 到 G),最后其余光源以 SH 進行渲染(G 到 H):

請注意,光源組會重疊;例如,最后一個每像素光源混合到每頂點光照模式,因此當對象和光源移動時,“光射量”(light popping) 較少。
基礎通道
基礎通道使用一個每像素方向光和所有 SH/每頂點光源來渲染對象。此通道還會添加著色器中的所有光照貼圖、環(huán)境光照和發(fā)射光照。在此通道中渲染的方向光可以具有陰影。請注意,光照貼圖的對象不會從 SH 光源獲得光照。
請注意,在著色器中使用“OnlyDirectional”通道標志時,前向基礎通道僅渲染主方向光、環(huán)境光/光照探針和光照貼圖(SH 和頂點光源不包括在通道數(shù)據(jù)中)。
其他通道
對于影響此對象的每個額外的每像素光源,需要額外的渲染通道。默認情況下,這些通道中的光源沒有陰影(因此在結(jié)果中,前向渲染支持一個帶陰影的方向光),除非使用?multi_compile_fwdadd_fullshadows?變體快捷方式。
性能注意事項
球諧函數(shù)光源的渲染速度_很_快。這些光源的 CPU 成本很低,并且使用 GPU 的_成本基本為零_(也就是說,基礎通道始終會計算 SH 光照;但由于 SH 光源工作方式的原因,無論 SH 光源有多少,成本都完全相同)。
SH 光源的缺點:
按對象的頂點而不是按像素計算。這意味著它們不支持光照剪影和法線貼圖。
SH 光照的頻率很低。SH 光源無法實現(xiàn)快速的光照過渡。它們也只影響漫射光照(頻率對鏡面高光而言太低)。
SH 光照不是局部光照;SH 點光源或聚光燈在靠近某種表面時“看起是錯誤的”。
總的來說,SH 光源通常足以達到小型動態(tài)對象的光照要求。