unity5 的render path ,比4的區別就是使用的新的deferred rendering,之前的4的deferred rendering(其實是light prepass)也被保留了下來。
Legacy Deferred Lighting Rendering Path(light prepass)
老 舊的Deferred Rendering Path,使用了light prepass渲染。因為它是老舊的(unity5之前的Deferred Lighting,但是unity5還留着它使用),所以不支持一些新的渲染特性,比如unity5的新pbr shader standard shader,還有新的reflection probes。可以換成新的Deferred Lighting。
好處就是沒有對光源個數 限制,因為它把所有光照計算所需要的數據都渲染到了render target中。所有的光照都是逐像素計算,可以與法線貼圖正確交互。所有的光都有cookies和陰影。因為它是逐像素計算光照,所以不像頂點着色多邊 形明顯,不真實。逐頂點光照,就是在vetext shader中計算光照顏色,每個頂點計算一次光照,再進行插值。逐像素計算光照就是每個像素都計算光照,在fragement shader中計算。
light prepass渲染中的開銷與光找到的像素數量呈正相關,與場景復雜度無關,與光的體積范圍相關,與被照亮的物體個數無關。所以,使光的體積變小可以提升性能。
light prepass渲染不支持抗鋸齒,也無法處理半透明物體,半透明物體如圖所示將會用forward rendering處理,網格物體也不能接受陰影,只能用四個camera culling masks,(官方文檔解釋: You can only use up to four culling masks. That is, your culling layer mask must at least contain all layers minus four arbitrary layers, so 28 of the 32 layers must be set. Otherwise you will get graphical artefacts.)
使用它必須定義Shader Model 3.0以上,支持Depth render textures和two-sided stencil buffers。2004年后的大部分的pc都支持light prepass
light prepass的消耗全部來自光照射到物體需要渲染的像素個數,完全不取決於場景復雜度,所以小的點光源,和spot光,或者光照被遮擋,都是消耗很少的(優化可以從此處下手)。為了產生陰影也要渲染幾次,所以陰影也有部分開銷。
light prepass在unity中需要3個pass
1. Base Pass:首先計算屏幕空間緩沖信息:depth, normal,和specular power
2. Lighting pass: 使用上面的緩沖信息在其他的緩沖區計算光照
3. Final pass: 物體再次渲染,獲取上面計算的光照和貼圖再加上環境光/自發光等等混合在一起。
過程如下圖所示,
如果物體的shader不能用light prepass處理,則會用forward rendering處理。
Base Pass
在這個pass中先渲染一遍物體,把view space的 normal和 specular power存在一張 ARGB32 Render Texture中,normal使用agb通道,specular使用a通道。
Base Pass的結果就是把場景信息和一張 Render Texture填充在z buffer中。
Lighting Pass
Lighting Pass就是通過depth,normal和specular power計算光照。光照在screen space進行計算,所以消耗與需要計算的時間不取決於場景復雜程度。光照緩沖信息存在一張 ARGB32 Render Texture中,它包括漫反射光照在rgb通道,高光強度在a通道。光照值用 logarithmic encode可以有更好的動態范圍。當camera 的HDR選項被選擇,光照緩沖信息使用ARGBHalf 格式,不使用 logarithmic encode。
final pass
所有物體再一次全部渲染,獲取光照並與貼圖和環境光混合計算。Lightmaps也在final pass
中使用。相機離得近的地方進行實時光照,只烘焙 indirect lighting。相機離得遠的地方,光全部烘焙。
Deferred Lighting Rendering Path
unity5新的deferred rendering。
最大的好處就是不限制光源數量。所有的光照都是逐像素計算,可以與法線貼圖正確交互。所有的光都有cookies和陰影。
使用G-Buffer 的前提是這些數據可以一次性寫入多個render target, 即Multiple-Render-Target (MRT).
deferred rendering中的開銷與光找到的像素數量呈正相關,與場景復雜度無關,與光的體積范圍相關,與被照亮的物體個數無關。所以,使光的體積變小可以提升性能。
deferred rendering不支持抗鋸齒,也無法處理半透明物體,半透明物體如圖所示將會用forward rendering處理,網格物體也不能接受陰影,只能用四個
延遲渲染不能渲染半透明的原因gpu pro2給出了解釋:
In particular, deferred rendering solutions have difficulty representing transparent materials, because information regarding surfaces seen through the material would be discarded. 是因為被discard掉了。
使 用它需要一個支持Multiple Render Targets (MRT)的顯卡,必須定義Shader Model 3.0以上,支持Depth render textures和two-sided stencil buffers。2005年后的大部分的pc都支持deferred rendering。
deferred rendering的消耗全部來自光照射到物體需要渲染的像素個數,完全不取決於場景復雜度,所以小的點光源,和spot光,或者光照被遮擋,都是消耗很少的(優化可以從此處下手)。為了產生陰影也要渲染幾次,所以陰影也有部分開銷。
在deferred rendering中經過兩個pass
1. G-buffer pass:所有物體先渲染一遍,計算出diffuse color,specular color , smoothness, world space normal,emission和depth,存在screen space 緩沖信息中。
2. Lighting pass:增加光照到前面的emission緩沖信息中。
基本如下圖所示(unity 在G-buffer中生成的信息比圖中要多具體看1)
如果物體的shader不能用light prepass處理,則會用forward rendering處理。
默認 g-buffer布局,4個render targetRT0,RT1,RT2,RT3:
RT0, ARGB32 格式: Diffuse color (RGB), 不使用(A).
RT1, ARGB32格式: Specular color (RGB), roughness (A).
RT2, ARGB2101010格式: World space normal (RGB), 不使用(A).
RT3, ARGB32 (non-HDR) 或 ARGBHalf (HDR) 格式: Emission + lighting + lightmaps + reflection probes buffer.
Depth+Stencil buffer.
ARGB32:每個通道8位整型
ARGBHalf :每個通道16位浮點型(所以在相機HDR模式使用這種格式儲存光照可以獲得更大動態范圍,光照細節更細致。但是有些圖形卡不支持浮點型的render texture,使用需注意,可以用使用SystemInfo.SupportsRenderTextureFormat檢查)
所以g-buffer中在無HDR情況下是160bits/像素,有HDR情況下是192/像素。
G-Buffer Pass
每 個物體都渲染一次,Diffuse, specular, surface smoothness, world space normal, 和emission+ambient+reflections+lightmaps 被渲染進 g-buffer貼圖。g-buffer貼圖作為材質的全局參數可以被使用(名字叫CameraGBufferTexture0 .. CameraGBufferTexture3)
Light Pass
在Light Pass中通過g-buffer和depth計算光照,在screen space中計算,所以消耗與需要計算的時間不取決於場景復雜程度。光照信息存儲在emission緩沖中。
參考:http://docs.unity3d.com/Manual/RenderTech-DeferredShading.html
http://blog.csdn.net/xoyojank/article/details/4460953
-----by wolf96