簡述
U3D支持不同的Rendering Path(渲染路徑),開發(fā)者應(yīng)該根據(jù)游戲內(nèi)容和目標平臺,硬件等來選擇使用哪個Rendering Path。不同的Rendering Path具有不同的表現(xiàn)效果,這些不同之處多體現(xiàn)在光照和陰影方面忍饰。查閱Render Pipeline獲取更多的細節(jié)。
可以在Editor-->Project Setting-->Graphics中設(shè)置默認的Rendering Path,也可以針對單獨的Camera進行設(shè)置钠右。
如果目標平臺的顯卡不能處理所選擇的硬件,那么Unity會自動過渡至低保真檔次Rendering Path去忘蟹。比如有的GPU不能處理Deferred Shading飒房,那就會自動采用Forward Rendering。
下面按從高效果至低效果的順序開始講解不同的Rendering Path媚值。
Deferred Shading Rendering Path
概述
由于在移動開發(fā)中并不常用Deferred Shading狠毯,故本節(jié)不細述。
Shader中使用的LightMode Pass Tag: Deferred
Deferred Shading擁有最佳的光照和陰影效果褥芒。當(dāng)場景中存在許多的實時光照時嚼松,使用Deferred Shading也是最佳的方案。當(dāng)然Deferred Shading對硬件的要求稍高锰扶。
Deferred Shading是一種屏幕空間著色技術(shù)献酗,之所以叫做Deferred(延遲的,延期的)坷牛,是因為Shading的時機不是發(fā)生在第一個Pass的Vertex和Pixel/Fragment函數(shù)內(nèi)凌摄,而是存在延遲,直到第二Pass的時候才執(zhí)行漓帅。
Deferred Shading對影響物體的光源數(shù)量沒有限制锨亏,所有的光源都是Per-Pixel(逐像素)光照痴怨,即所有光源都可以正確的和法線貼圖得到正確的計算結(jié)果。另外器予,所有的光源都可以有Light Cookie和陰影浪藻。其性能開銷與光源數(shù)量成正比,這意味著可以通過控制光照面積乾翔,減少單個物體受到光照影響的數(shù)量來獲得性能方面的提升爱葵。Deferred Shading的另一個優(yōu)點是結(jié)果能夠很方便的預(yù)測,被個光源都是逐像素光照反浓,具有一致的光照計算過程萌丈。
缺點在于,其不能真正的支持抗鋸齒以及半透明物體(半透明物體是用 Forward Rendering 渲染路徑)雷则。同時也不支持Unity3D中的Mesh Renderer組件的Receive Shadows功能辆雾,對Culling Masks的支持也不完善,最多能使用四個Culling Mask月劈。
Q: 什么是Light Cookie度迂?
A: Light Cookie又被稱作Cucoloris。是一種應(yīng)用在電影攝制時的小技巧猜揪,如下兩張圖惭墓,具體的解釋可以查看Wiki,Unity3D中的應(yīng)用可以查看Unity3D Cookies手冊或Unity3d Spot Light Cookie而姐,Unity3D中的實現(xiàn)視頻過程可以點擊這里:
要求
顯卡應(yīng)支持Multiple Render Targets(MRT)腊凶,Shader Model 3.0(及更高),Depth Render Textures拴念。大多數(shù)產(chǎn)于2006年以后的PC顯卡都支持本功能吭狡。
因為對MRT功能支持的缺失,本功能在移動端不受支持丈莺。(有的GPU支持划煮,但是支持的程度也非常有限。)
注意:當(dāng)使用Orthographic projection(正交投影)時Deferred rendering不適用缔俄。當(dāng)使用正交投影時會降至 Forward Rendering弛秋。
性能方面
性能方面的影響取決于物體受光源影響的數(shù)量,而不是場景的復(fù)雜度俐载。小面積的點光源或聚光燈蟹略,或光源被部分或完全摭擋,可以在很好的降低性能開銷遏佣。
有陰影的光源開銷更大挖炬,在Deferred rendering中,受到投影光源影響的状婶,且可投影的物體依然是要對影響其的每個投影光源都進行計算意敛。具有陰影的光照Shader也肯定比沒有陰影的開銷更大馅巷。
Forward Rendering Rendering Path
概述
Shader中使用的LightMode Pass Tag: ForwardBase和ForwardAdd
當(dāng)Forward不可以用時會以Legacy Vertex Lit Rendering Path的效果進行渲染
Forward是傳統(tǒng)渲染路徑。支持所有的Unity圖形特性草姻。在默認情況下钓猬,只有少數(shù)最亮的光源得以成為Per-Pixel光源。其他的光源則視為Per-Vertex撩独。
取決于影響物體的光源數(shù)量敞曹,F(xiàn)orward 在單個或多個Pass內(nèi)渲染物體。需要注意的是综膀,光源根據(jù)設(shè)置或強度的不同澳迫,本身也會具有不同的特性。
使用指南
Forward下剧劝,一些(視Quality Setting里面的設(shè)置而定)最亮的光源渲染物體時以Per-Pixel的方式進行橄登。緊接著可有四個光源為Per-Vetex光源。其余的光源都以球諧函數(shù)(SH:Spherical Harmonics)進行計算担平,可以高效但是粗略的得到計算結(jié)果。無論光源是不是Per-Pixel的都依賴以下規(guī)則:
- 光源的Render Mode設(shè)為Not Important的锭部,則不是Per-Pixel光源
- 最亮的平行光是Per-Pixel光源
- 光源的Render Mode設(shè)為Important的暂论,則為Per-Pixel光源
- 如果場景中的per-pixel光源數(shù)量少于Quality Setting中的Pixel Light Count設(shè)置的數(shù)量,則會按光照強度從強至弱的順序拌禾,將更多的光源設(shè)置為per-pixel取胎。
渲染每個物體時會依以下規(guī)則:
- Base Pass只會用到一個per-pixel光源,以及所有其它Per-Vertex光源或SH光源
- 其它的per-pixel光源則在Additional Pass中渲染湃窍,并且每個Pass對應(yīng)一個per-pixel光源
例如有物體受到如下A-H光源的影響:
假設(shè)所有光源都有相同的強度和顏色闻蛀,并且Render Mode都設(shè)為Auto。最亮的4個光源A-D則為per-pixel光源您市,接著是四個per-vertex光源觉痛,D-G,最后余下的光源則是SH球諧光源茵休,G-H薪棒。
注意上圖中光源分組的重疊部份。例如最后一個既可以成為per-pixel光源也可以成為per-vertex光源榕莺,因此當(dāng)物體或光源移動時俐芯,產(chǎn)生Light Popping(因光照導(dǎo)致的畫面不正常)的可能性更小。
關(guān)于Light Popping問題的實例钉鸯,點擊這里 吧史,提問者最后通過調(diào)整光照亮度得以解決。
Base Pass
Base Pass只用一個per-pixel光源和所有的SH/Vertex 光源來渲染物體唠雕。在這個pass內(nèi)也能通過shader加入光照貼圖(Lightmaps)贸营,環(huán)境光(ambient)吨述,自發(fā)光(Emissive)等。平行光在這個Pass內(nèi)產(chǎn)生陰影莽使。
注意:
- 使用LightMaps的物體(烘培過的物體)不會受到SH光源的光照锐极。
- 當(dāng)在Shader中使用Passflag tag “OnlyDirectional”時,forward base pass只會渲染主平行光芳肌,環(huán)境光照探頭(Ambient/Light Probe)和光照貼圖灵再,SH和vertex光源沒有被包含在此pass的數(shù)據(jù)內(nèi)。
Additional Passes
Additional Passes用于渲染每個額外的per-pixel光源亿笤。在這些pass中的光源默認是不會產(chǎn)生陰影的(也就是說翎迁,F(xiàn)orward Rendering默認只支持一個光源可以產(chǎn)生陰影)。除非使用multi_compile_fwdadd_fullshadows宏净薛。
性能相關(guān)
Spherical Harmonics lights(球諧光照)非常高效汪榔。對CPU的消耗極其微小,對于GPU來說不會有額外的負擔(dān)(因為base pass原本就會一直計算SH Lighting肃拜;和球諧光照的機制有光痴腌,無論有多少球諧光的存在,消耗都是一樣的)燃领。
擴展閱讀士聪,Enlighten的簡化球諧光照文檔,《球諧照明:細節(jié)》猛蔽,《球諧照明:細節(jié)》講義剥悟,球諧照明原理
SH光照的缺點:
- 利用物體的vertices(Vertex單詞的復(fù)數(shù)形式,Vertex的復(fù)數(shù)有三種寫法: vertexes曼库,vertices 区岗,vertexs)進行計算,而不是pixels毁枯。因此不支持法線貼圖和Light Cookies慈缔。
- SH光照函數(shù)是種非常低頻的照明函數(shù),不會有非常銳利的照明過渡种玛,另外也只會響應(yīng)Diffuse Lighting(漫反射)胀糜,對于Specular Highlight(鏡面高光)而言其頻率太低了。
- SH lighting is not local; point or spot SH lights close to some surface will “l(fā)ook wrong”. 球諧照明不是局部的(蒂誉?局部坐標系教藻?),點光源或聚光燈形式的SH Light在靠近一些表面時看上去會不正常右锨。
總結(jié)括堤,SH Light適用于小型動態(tài)物體。
Legacy Deferred Lighting Rendering Path
概述
Shader中使用的LightMode Pass Tag: PrepassBase和PrepassFinal
Legacy Deferred (light prepass) 類似于Deferred Shading,但是和其運用了不同的技術(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)特性轧抗,因為其無法支持諸如Stander Shader恩敌,Reflection Probes等特性。新工程可以考慮直接使用 Deferred Shading(不適用于移動平臺)横媚。
注意:當(dāng)使用Orthographic projection時Deferred Rendering Path 不適用纠炮。當(dāng)使用正交投影時會降至 Forward Rendering Path。
注意:Legacy Deferred Lighting Rendering Path 和 Deferred Shading Rendering Path 都是Deferred rendering灯蝴。
Deferred Lighting對影響物體的光源數(shù)量沒有限制恢口,所有的光源都是Per-Pixel光照,即所有光源都可以正確的和法線貼圖得到正確的計算結(jié)果穷躁。另外耕肩,所有的光源都可以有Light Cookie和Shadow。其性能開銷與光源數(shù)量成正比问潭,這意味著可以通過控制光照面積猿诸,減少單個物體受到光照影響的數(shù)量來獲得性能方面的提升。Deferred Lighting的另一個優(yōu)點是結(jié)果能夠很方便的預(yù)測狡忙,被個光源都是逐像素光照梳虽,具有一致的光照計算過程。
其缺點在于不能真正的支持抗鋸齒以及半透明物體(半透明物體采用 Forward Rendering 渲染路徑)去枷。同時也不支持Unity3D中的Mesh Renderer組件的Receive Shadows功能怖辆,對Culling Masks的支持也不完善是复,最多能使用四個Culling Mask删顶。
要求
顯卡應(yīng)支持Shader Model 3.0(或更新的版本),Depth Render Textures淑廊,Two-sided Stencil Buffers逗余。大多數(shù)產(chǎn)于2004年以后的PC顯卡都支持本功能。
在手機端季惩,所有支持OpenGL ES 3.0r GPU都支持Deferred Lighting. 部份OpenGL ES 2.0的GPU也能支持(因為支持Depth Textures)录粱。
注意:當(dāng)使用Orthographic projection(正交投影)時Deferred rendering不適用。當(dāng)使用正交投影時會降至 Forward Rendering画拾。
性能方面
性能方面的影響取決于物體受光源影響的數(shù)量啥繁,而不是場景的復(fù)雜度。小面積的點光源或聚光燈青抛,或光源被部分或完全摭擋旗闽,可以在很好的降低性能開銷。
有陰影的光源開銷更大,在Deferred Rendering中适室,受到投影光源影響的嫡意,且可投影的物體依然是要對影響其的每個投影光源都進行計算。具有陰影的光照Shader也肯定比沒有陰影的開銷更大捣辆。
使用指南
使用Deferred Lighting蔬螟, 渲染過程發(fā)生在三種Pass內(nèi)。
- Base Pass:物體產(chǎn)生screen-space buffers, 包含depth, normals, specular power等信息汽畴。
- Lighting Pass:前一階段生成的Scree-space buffers用來計算光照旧巾,并放入另一個screen-space buffers。
- Final Pass:物體再次被處理整袁,取得前一階段計算的光照信息菠齿,結(jié)合色彩紋理,并添加ambient/emissive Lighting坐昙。
如果物體使用了不適用于Deferred Lighting Rendering Path的Shader绳匀,會使用Forward rendering path
Base Pass
Base pass會對物體進行一次處理。View sapce normals(視野空間法線)和Specular Power(高光強度)被處理為一張ARGB32格式的[Render Texture](RGB值為normals炸客, A為Specular Power)疾棵。如果目標平臺和硬件允許Z buffer以紋理的形式讀取,則不用再進行額外的渲染流程痹仙。反之是尔,則要在另一個Pass使用Shader Replacement的Shader中進行處理。
Lighting Pass
lighting passs根據(jù)Depth开仰,Normal和Specular power來計算光照拟枚。光照計算發(fā)生在Screen Space(屏幕空間)中,因此時間消耗取決與場景的復(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
效果最差,不支持實時陰影捡遍。屬于Forward Rendering Path的子集锌订。是性能最高,受支持度最多的Rendering Path(但是主機上不適用)画株。
所有的光照計算在Vertex層面完成辆飘,因此無法支持大多數(shù)的per-pixel效果涩搓,比如,陰影劈猪,法線貼圖昧甘,Light Cookies,精細的高光效果战得。
LightMode Tags
光照模型 Tags
光照模型 tag定義了pass通道在光照計算管道的角色充边,看一下下列渲染管道的細節(jié),這些tags很少手動調(diào)用常侦,大多數(shù)情況下只需要把光照交互的著色器改為Surface Shaders浇冰,然后所有這些細節(jié)都會被自動處理掉。
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 | - |