unity的渲染路徑
阿新 • • 發佈:2018-12-10
三種渲染路徑:
- 前向渲染路徑(ForwardRenderingPath)
- 延遲渲染路徑(DeferredRenderingPath)
- 頂點照明渲染路徑(VertexLitRenderingPath)unity5.0後棄掉
- 大多數情況下,一個專案只使用一種渲染路徑
渲染路徑的設定
- 通過攝像機和player中的Rendering path來設定
- 每個pass中使用標籤來指定該pass使用的渲染路徑【p181】
前向渲染路徑
兩個緩衝區:
- 顏色緩衝
- 深度緩衝(決定光源是否可見)
向前渲染的三種處理光照的方式
- 逐頂點處理
- 逐畫素處理
- 球諧函式(Spherical Harmonics,SH)處理
逐畫素處理
- 被設定成Important的光源 /
- 場景中最亮的平行光 /
- ProjectSetting-> Quality中的Pixel Light Count 引數,逐畫素光源數量
決定一個光源使用哪種處理模式取決於它的型別和渲染模式
- 光源型別:平行光還是其他。在light元件Type中設定
- 光源的渲染模式:該光源是否重要(Important)。在light元件RenderMode中設定
ProjectSetting-> Quality中的VSync Count 引數會影響你的FPS,
- Don‘t Sync:關閉垂直同步,不建議,關閉後在不同效能的機器上,會幀率不穩定。
- EveryVBlank相當於FPS=60,但是並不是嚴格的60,也會高於60,但是不會高太多。當然如果機器卡,會低到50,40,甚至無下限。
- EverySecondVBlank = 30左右,具體指與上邊類似。
- 如果你想設定為其他值的FPS的話,需要手動調整FPS,首先關閉垂直同步這個功能(即選擇Don‘t Sync),然後在程式碼的Awake方法裡手動設定FPS(Application.targetFrameRate = 你需要的值;)
pass中的光照計算
向前渲染的兩種pass:
對於向前渲染來說一個unity shader 會定義一個BasePass(也可以多個,如雙面渲染)和一個Additional。
一個BasePass僅執行一次,而一個Additional會根據影響該物體的其他逐畫素光源的數目被多次呼叫,即每個逐畫素光源執行一次Additional。
1.Base Pass
Tags{"LightMode"="ForwardBase"}
#pragma multi_compile_fwdbase
//一個逐畫素的平行光以及所有逐頂點和SH光源
/*可實現的光照效果
光照紋理
環境光
自發光
陰影(平行光的陰影)*/
2.Additional Pass
Tags{"LightMode"="ForwardAdd"}
//混合模式,光照疊加
Blend One One
#pragma multi_compile_fwdadd
//其他影響該物體的逐畫素光源,每個光源執行一次Pass
/*預設情況下不支援陰影,通過替換編譯指令開啟陰影
//#pragma multi_compile_fwdadd_fullshadows
但這需要unity在內部使用更多的shader變種*/
#pragma multi_compile_fwdbase/fwdadd 保證unity可以為相應的型別的Pass生成所需要的shader變種,這些變種會處理不同條件下的渲染邏輯 例如:是否使用光照貼圖,是否開啟陰影,當前處理哪種光源型別
頂點照明渲染路徑
- 對硬體配置要求少,運算效能最高,效果最差。
- 不支援陰影,法線對映,高精度的高光反射等
- 所有可以在頂點照明中實現的功能都可以在前向渲染路徑中完成
- 如果選擇使用頂點照明渲染路徑,那麼unity會只填充那些逐頂點相關的光源變數,意味著我們不可以使用一些逐畫素光照變數
- 在未來頂點照明可能會被移除
延遲渲染
延遲渲染主要包含兩個pass:
- 不計算光照,只看是否可見,僅把光照計算的相關資訊儲存到G緩衝區中。
- 利用G緩衝中的資訊進行真正的光照計算
- 延遲渲染的效率不依賴於場景的複雜程度,而是和我們使用的螢幕空間的大小有關
- 適合場景中光源數目很多的,並且每個光源都會按照逐畫素的方式處理
- 缺點:
- 不支援真正的抗鋸齒(anit-aliasing)功能
- 不能處理半透明物體
- 對顯示卡有一定要求
預設的G快取區包含的渲染紋理(Render texture,RT):
- RT0:格式是ARGB32,RGB通道用於儲存漫反射顏色,A通道沒有被使用。
- RT1:格式是ARGB32,RGB通道用於儲存高光反射顏色,A通道用於儲存高光反射的指數部分。
- RT2:格式是ARGB2101010,RGB通道用於儲存法線,A通道沒有被使用。
- RT3:格式是ARGB32(非HDR)或ARGBHalf(HDR),用於儲存自發光+lightmap+反射探針(reflection probes)。
- 深度緩衝和模板緩衝
當在第二個pass中計算光照時,預設情況下僅可以使用unity內建的Standard光照模式