1. 程式人生 > >unity的渲染路徑

unity的渲染路徑

三種渲染路徑:

  1. 前向渲染路徑(ForwardRenderingPath)
  2. 延遲渲染路徑(DeferredRenderingPath)
  3. 頂點照明渲染路徑(VertexLitRenderingPath)unity5.0後棄掉
  • 大多數情況下,一個專案只使用一種渲染路徑

渲染路徑的設定

  • 通過攝像機和player中的Rendering path來設定
  • 每個pass中使用標籤來指定該pass使用的渲染路徑【p181】

前向渲染路徑

兩個緩衝區:

  1. 顏色緩衝
  2. 深度緩衝(決定光源是否可見)

向前渲染的三種處理光照的方式

  1. 逐頂點處理
  2. 逐畫素處理
  3. 球諧函式(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:

  1. 不計算光照,只看是否可見,僅把光照計算的相關資訊儲存到G緩衝區中。
  2. 利用G緩衝中的資訊進行真正的光照計算
  • 延遲渲染的效率不依賴於場景的複雜程度,而是和我們使用的螢幕空間的大小有關
  • 適合場景中光源數目很多的,並且每個光源都會按照逐畫素的方式處理
  • 缺點:
  1. 不支援真正的抗鋸齒(anit-aliasing)功能
  2. 不能處理半透明物體
  3. 對顯示卡有一定要求

預設的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光照模式