簡(jiǎn)述
U3D支持不同的Rendering Path(渲染路徑),開(kāi)發(fā)者應(yīng)該根據(jù)游戲內(nèi)容和目標(biāo)平臺(tái),硬件等來(lái)選擇使用哪個(gè)Rendering Path。不同的Rendering Path具有不同的表現(xiàn)效果,這些不同之處多體現(xiàn)在光照和陰影方面。查閱Render Pipeline獲取更多的細(xì)節(jié)。
可以在Editor-->Project Setting-->Graphics中設(shè)置默認(rèn)的Rendering Path,也可以針對(duì)單獨(dú)的Camera進(jìn)行設(shè)置。


如果目標(biāo)平臺(tái)的顯卡不能處理所選擇的硬件,那么Unity會(huì)自動(dòng)過(guò)渡至低保真檔次Rendering Path去。比如有的GPU不能處理Deferred Shading,那就會(huì)自動(dòng)采用Forward Rendering。
下面按從高效果至低效果的順序開(kāi)始講解不同的Rendering Path。
Deferred Shading Rendering Path
概述
由于在移動(dòng)開(kāi)發(fā)中并不常用Deferred Shading,故本節(jié)不細(xì)述。
Shader中使用的LightMode Pass Tag: Deferred
Deferred Shading擁有最佳的光照和陰影效果。當(dāng)場(chǎng)景中存在許多的實(shí)時(shí)光照時(shí),使用Deferred Shading也是最佳的方案。當(dāng)然Deferred Shading對(duì)硬件的要求稍高。
Deferred Shading是一種屏幕空間著色技術(shù),之所以叫做Deferred(延遲的,延期的),是因?yàn)镾hading的時(shí)機(jī)不是發(fā)生在第一個(gè)Pass的Vertex和Pixel/Fragment函數(shù)內(nèi),而是存在延遲,直到第二Pass的時(shí)候才執(zhí)行。
Deferred Shading對(duì)影響物體的光源數(shù)量沒(méi)有限制,所有的光源都是Per-Pixel(逐像素)光照,即所有光源都可以正確的和法線貼圖得到正確的計(jì)算結(jié)果。另外,所有的光源都可以有Light Cookie和陰影。其性能開(kāi)銷與光源數(shù)量成正比,這意味著可以通過(guò)控制光照面積,減少單個(gè)物體受到光照影響的數(shù)量來(lái)獲得性能方面的提升。Deferred Shading的另一個(gè)優(yōu)點(diǎn)是結(jié)果能夠很方便的預(yù)測(cè),被個(gè)光源都是逐像素光照,具有一致的光照計(jì)算過(guò)程。
缺點(diǎn)在于,其不能真正的支持抗鋸齒以及半透明物體(半透明物體是用 Forward Rendering 渲染路徑)。同時(shí)也不支持Unity3D中的Mesh Renderer組件的Receive Shadows功能,對(duì)Culling Masks的支持也不完善,最多能使用四個(gè)Culling Mask。
Q: 什么是Light Cookie?
A: Light Cookie又被稱作Cucoloris。是一種應(yīng)用在電影攝制時(shí)的小技巧,如下兩張圖,具體的解釋可以查看Wiki,Unity3D中的應(yīng)用可以查看Unity3D Cookies手冊(cè)或Unity3d Spot Light Cookie,Unity3D中的實(shí)現(xiàn)視頻過(guò)程可以點(diǎn)擊這里:

要求
顯卡應(yīng)支持Multiple Render Targets(MRT),Shader Model 3.0(及更高),Depth Render Textures。大多數(shù)產(chǎn)于2006年以后的PC顯卡都支持本功能。
因?yàn)閷?duì)MRT功能支持的缺失,本功能在移動(dòng)端不受支持。(有的GPU支持,但是支持的程度也非常有限。)
注意:當(dāng)使用Orthographic projection(正交投影)時(shí)Deferred rendering不適用。當(dāng)使用正交投影時(shí)會(huì)降至 Forward Rendering。
性能方面
性能方面的影響取決于物體受光源影響的數(shù)量,而不是場(chǎng)景的復(fù)雜度。小面積的點(diǎn)光源或聚光燈,或光源被部分或完全摭擋,可以在很好的降低性能開(kāi)銷。
有陰影的光源開(kāi)銷更大,在Deferred rendering中,受到投影光源影響的,且可投影的物體依然是要對(duì)影響其的每個(gè)投影光源都進(jìn)行計(jì)算。具有陰影的光照Shader也肯定比沒(méi)有陰影的開(kāi)銷更大。
Forward Rendering Rendering Path
概述
Shader中使用的LightMode Pass Tag: ForwardBase和ForwardAdd
當(dāng)Forward不可以用時(shí)會(huì)以Legacy Vertex Lit Rendering Path的效果進(jìn)行渲染
Forward是傳統(tǒng)渲染路徑。支持所有的Unity圖形特性。在默認(rèn)情況下,只有少數(shù)最亮的光源得以成為Per-Pixel光源。其他的光源則視為Per-Vertex。
取決于影響物體的光源數(shù)量,F(xiàn)orward 在單個(gè)或多個(gè)Pass內(nèi)渲染物體。需要注意的是,光源根據(jù)設(shè)置或強(qiáng)度的不同,本身也會(huì)具有不同的特性。
使用指南
Forward下,一些(視Quality Setting里面的設(shè)置而定)最亮的光源渲染物體時(shí)以Per-Pixel的方式進(jìn)行。緊接著可有四個(gè)光源為Per-Vetex光源。其余的光源都以球諧函數(shù)(SH:Spherical Harmonics)進(jìn)行計(jì)算,可以高效但是粗略的得到計(jì)算結(jié)果。無(wú)論光源是不是Per-Pixel的都依賴以下規(guī)則:
- 光源的Render Mode設(shè)為Not Important的,則不是Per-Pixel光源
- 最亮的平行光是Per-Pixel光源
- 光源的Render Mode設(shè)為Important的,則為Per-Pixel光源
- 如果場(chǎng)景中的per-pixel光源數(shù)量少于Quality Setting中的Pixel Light Count設(shè)置的數(shù)量,則會(huì)按光照強(qiáng)度從強(qiáng)至弱的順序,將更多的光源設(shè)置為per-pixel。
渲染每個(gè)物體時(shí)會(huì)依以下規(guī)則:
- Base Pass只會(huì)用到一個(gè)per-pixel光源,以及所有其它Per-Vertex光源或SH光源
- 其它的per-pixel光源則在Additional Pass中渲染,并且每個(gè)Pass對(duì)應(yīng)一個(gè)per-pixel光源
例如有物體受到如下A-H光源的影響:


假設(shè)所有光源都有相同的強(qiáng)度和顏色,并且Render Mode都設(shè)為Auto。最亮的4個(gè)光源A-D則為per-pixel光源,接著是四個(gè)per-vertex光源,D-G,最后余下的光源則是SH球諧光源,G-H。
注意上圖中光源分組的重疊部份。例如最后一個(gè)既可以成為per-pixel光源也可以成為per-vertex光源,因此當(dāng)物體或光源移動(dòng)時(shí),產(chǎn)生Light Popping(因光照導(dǎo)致的畫面不正常)的可能性更小。
關(guān)于Light Popping問(wèn)題的實(shí)例,點(diǎn)擊這里 ,提問(wèn)者最后通過(guò)調(diào)整光照亮度得以解決。

Base Pass
Base Pass只用一個(gè)per-pixel光源和所有的SH/Vertex 光源來(lái)渲染物體。在這個(gè)pass內(nèi)也能通過(guò)shader加入光照貼圖(Lightmaps),環(huán)境光(ambient),自發(fā)光(Emissive)等。平行光在這個(gè)Pass內(nèi)產(chǎn)生陰影。
注意:
- 使用LightMaps的物體(烘培過(guò)的物體)不會(huì)受到SH光源的光照。
- 當(dāng)在Shader中使用Passflag tag “OnlyDirectional”時(shí),forward base pass只會(huì)渲染主平行光,環(huán)境光照探頭(Ambient/Light Probe)和光照貼圖,SH和vertex光源沒(méi)有被包含在此pass的數(shù)據(jù)內(nèi)。
Additional Passes
Additional Passes用于渲染每個(gè)額外的per-pixel光源。在這些pass中的光源默認(rèn)是不會(huì)產(chǎn)生陰影的(也就是說(shuō),F(xiàn)orward Rendering默認(rèn)只支持一個(gè)光源可以產(chǎn)生陰影)。除非使用multi_compile_fwdadd_fullshadows宏。
性能相關(guān)
Spherical Harmonics lights(球諧光照)非常高效。對(duì)CPU的消耗極其微小,對(duì)于GPU來(lái)說(shuō)不會(huì)有額外的負(fù)擔(dān)(因?yàn)閎ase pass原本就會(huì)一直計(jì)算SH Lighting;和球諧光照的機(jī)制有光,無(wú)論有多少球諧光的存在,消耗都是一樣的)。
擴(kuò)展閱讀,Enlighten的簡(jiǎn)化球諧光照文檔,《球諧照明:細(xì)節(jié)》,《球諧照明:細(xì)節(jié)》講義,球諧照明原理
SH光照的缺點(diǎn):
- 利用物體的vertices(Vertex單詞的復(fù)數(shù)形式,Vertex的復(fù)數(shù)有三種寫法: vertexes,vertices ,vertexs)進(jìn)行計(jì)算,而不是pixels。因此不支持法線貼圖和Light Cookies。
- SH光照函數(shù)是種非常低頻的照明函數(shù),不會(huì)有非常銳利的照明過(guò)渡,另外也只會(huì)響應(yīng)Diffuse Lighting(漫反射),對(duì)于Specular Highlight(鏡面高光)而言其頻率太低了。
- SH lighting is not local; point or spot SH lights close to some surface will “l(fā)ook wrong”. 球諧照明不是局部的(?局部坐標(biāo)系?),點(diǎn)光源或聚光燈形式的SH Light在靠近一些表面時(shí)看上去會(huì)不正常。
總結(jié),SH Light適用于小型動(dòng)態(tài)物體。
Legacy Deferred Lighting Rendering Path
概述
Shader中使用的LightMode Pass Tag: PrepassBase和PrepassFinal
Legacy Deferred (light prepass) 類似于Deferred Shading,但是和其運(yùn)用了不同的技術(shù),有不同的側(cè)重。不支持Unity5的Physically Based Standard Shader。關(guān)于Legacy Deferred的原理可以查看RTR(Real-Time Rendering)網(wǎng)站的文章《Deferred lighting approaches》
Deferred Lighting從Unity 5.0起被視為傳統(tǒng)特性,因?yàn)槠錈o(wú)法支持諸如Stander Shader,Reflection Probes等特性。新工程可以考慮直接使用 Deferred Shading(不適用于移動(dòng)平臺(tái))。
注意:當(dāng)使用Orthographic projection時(shí)Deferred Rendering Path 不適用。當(dāng)使用正交投影時(shí)會(huì)降至 Forward Rendering Path。
注意:Legacy Deferred Lighting Rendering Path 和 Deferred Shading Rendering Path 都是Deferred rendering。
Deferred Lighting對(duì)影響物體的光源數(shù)量沒(méi)有限制,所有的光源都是Per-Pixel光照,即所有光源都可以正確的和法線貼圖得到正確的計(jì)算結(jié)果。另外,所有的光源都可以有Light Cookie和Shadow。其性能開(kāi)銷與光源數(shù)量成正比,這意味著可以通過(guò)控制光照面積,減少單個(gè)物體受到光照影響的數(shù)量來(lái)獲得性能方面的提升。Deferred Lighting的另一個(gè)優(yōu)點(diǎn)是結(jié)果能夠很方便的預(yù)測(cè),被個(gè)光源都是逐像素光照,具有一致的光照計(jì)算過(guò)程。
其缺點(diǎn)在于不能真正的支持抗鋸齒以及半透明物體(半透明物體采用 Forward Rendering 渲染路徑)。同時(shí)也不支持Unity3D中的Mesh Renderer組件的Receive Shadows功能,對(duì)Culling Masks的支持也不完善,最多能使用四個(gè)Culling Mask。
要求
顯卡應(yīng)支持Shader Model 3.0(或更新的版本),Depth Render Textures,Two-sided Stencil Buffers。大多數(shù)產(chǎn)于2004年以后的PC顯卡都支持本功能。
在手機(jī)端,所有支持OpenGL ES 3.0r GPU都支持Deferred Lighting. 部份OpenGL ES 2.0的GPU也能支持(因?yàn)橹С諨epth Textures)。
注意:當(dāng)使用Orthographic projection(正交投影)時(shí)Deferred rendering不適用。當(dāng)使用正交投影時(shí)會(huì)降至 Forward Rendering。
性能方面
性能方面的影響取決于物體受光源影響的數(shù)量,而不是場(chǎng)景的復(fù)雜度。小面積的點(diǎn)光源或聚光燈,或光源被部分或完全摭擋,可以在很好的降低性能開(kāi)銷。
有陰影的光源開(kāi)銷更大,在Deferred Rendering中,受到投影光源影響的,且可投影的物體依然是要對(duì)影響其的每個(gè)投影光源都進(jìn)行計(jì)算。具有陰影的光照Shader也肯定比沒(méi)有陰影的開(kāi)銷更大。
使用指南
使用Deferred Lighting, 渲染過(guò)程發(fā)生在三種Pass內(nèi)。
- Base Pass:物體產(chǎn)生screen-space buffers, 包含depth, normals, specular power等信息。
- Lighting Pass:前一階段生成的Scree-space buffers用來(lái)計(jì)算光照,并放入另一個(gè)screen-space buffers。
- Final Pass:物體再次被處理,取得前一階段計(jì)算的光照信息,結(jié)合色彩紋理,并添加ambient/emissive Lighting。
如果物體使用了不適用于Deferred Lighting Rendering Path的Shader,會(huì)使用Forward rendering path
Base Pass
Base pass會(huì)對(duì)物體進(jìn)行一次處理。View sapce normals(視野空間法線)和Specular Power(高光強(qiáng)度)被處理為一張ARGB32格式的[Render Texture](RGB值為normals, A為Specular Power)。如果目標(biāo)平臺(tái)和硬件允許Z buffer以紋理的形式讀取,則不用再進(jìn)行額外的渲染流程。反之,則要在另一個(gè)Pass使用Shader Replacement的Shader中進(jìn)行處理。
Lighting Pass
lighting passs根據(jù)Depth,Normal和Specular power來(lái)計(jì)算光照。光照計(jì)算發(fā)生在Screen Space(屏幕空間)中,因此時(shí)間消耗取決與場(chǎng)景的復(fù)雜程度。Lighting Buffer是一張ARGB32的Render Texture,Diffuse Lighting使用其RGB通道,Specular Lighting使用其A通道。
Final Pass
處理紋理,自發(fā)光等其它內(nèi)容,另外,光照貼圖也在這里完成。
Legacy Vertex Lit Rendering Path
Shader中使用的 使用的LightMode Pass Tag: Vertex,VertexLMRGBM和VertexLM
效果最差,不支持實(shí)時(shí)陰影。屬于Forward Rendering Path的子集。是性能最高,受支持度最多的Rendering Path(但是主機(jī)上不適用)。
所有的光照計(jì)算在Vertex層面完成,因此無(wú)法支持大多數(shù)的per-pixel效果,比如,陰影,法線貼圖,Light Cookies,精細(xì)的高光效果。
LightMode Tags
光照模型 Tags
光照模型 tag定義了pass通道在光照計(jì)算管道的角色,看一下下列渲染管道的細(xì)節(jié),這些tags很少手動(dòng)調(diào)用,大多數(shù)情況下只需要把光照交互的著色器改為Surface Shaders,然后所有這些細(xì)節(jié)都會(huì)被自動(dòng)處理掉。
LightMode tags:
Always: Always rendered; no lighting is applied.
ForwardBase: Used in Forward rendering, ambient, main directional light, vertex/SH lights and lightmaps are applied.
ForwardAdd: Used in Forward rendering; additive per-pixel lights are applied, one pass per light.
Deferred: Used in Deferred Shading; renders g-buffer.
ShadowCaster: Renders object depth into the shadowmap or a depth texture.
PrepassBase: Used in legacy Deferred Lighting, renders normals and specular exponent.
PrepassFinal: Used in legacy Deferred Lighting, renders final color by combining textures, lighting and emission.
Vertex: Used in legacy Vertex Lit rendering when object is not lightmapped; all vertex lights are applied.
VertexLMRGBM: Used in legacy Vertex Lit rendering when object is lightmapped; on platforms where lightmap is RGBM encoded (PC & console).
VertexLM: Used in legacy Vertex Lit rendering when object is lightmapped; on platforms where lightmap is double-LDR encoded (mobile platforms).
Rendering Paths Comparison
| - | Deferred | Forward | Legacy Deferred | Vertex Lit |
|---|---|---|---|---|
| Features | ||||
| Per-pixel lighting (normal maps, light cookies) | Yes | Yes | Yes | - |
| Realtime shadows | Yes | With caveats | Yes | - |
| Reflection Probes | Yes | Yes | - | - |
| Depth&Normals Buffers | Yes | Additional render passes | Yes | - |
| Soft Particles | Yes | - | Yes | - |
| Semitransparent objects | - | Yes | - | Yes |
| Anti-Aliasing | - | Yes | - | Yes |
| Light Culling Masks | Limited | Yes | Limited | Yes |
| Lighting Fidelity | All per-pixel | Some per-pixel | All per-pixel | All per-vertex |
| Performance | ||||
| Cost of a per-pixel Light | Number of pixels it illuminates | Number of pixels * Number of objects it illuminates | Number of pixels it illuminates | - |
| Number of times objects are normally rendered | 1 | Number of per-pixel lights | 2 | 1 |
| Overhead for simple scenes | High | None | Medium | None |
| Platform Support | ||||
| PC (Windows/Mac) | Shader Model 3.0+ & MRT | All | Shader Model 3.0+ | All |
| Mobile (iOS/Android) | OpenGL ES 3.0 & MRT | All | OpenGL ES 2.0 | All |
| Consoles | XB1, PS4 | All | XB1, PS4, 360 | - |