1. 程式人生 > >unity的幾種渲染路徑比較

unity的幾種渲染路徑比較

轉自:http://edu.china.unity3d.com/learning_document/getData?file=/Manual/RenderingPaths.html

渲染路徑

Unity 支援不同的渲染路徑 (Rendering Paths)。應根據遊戲內容和目標平臺/硬體選擇所需的路徑。不同的渲染路徑功能和效能特徵不同,主要影響光照 (Lights) 和陰影 (Shadows)。

如果圖形卡無法處理所選的渲染路徑,Unity 將自動使用較低保真度的路徑。無法處理延遲光照 (Deferred Lighting) 的 GPU 將使用正向渲染 (Forward Rendering)。如果不支援正向渲染 (Forward Rendering),則將使用頂點光照 (Vertex Lit)。

延時光照渲染路徑

本頁面詳細說明了延時光照 (Deferred Lighting) 渲染路徑。有關延時光照的技術概述,請參閱本文

延時光照 (Deferred Lighting) 渲染路徑是具有最高光照和陰影保真度的渲染路徑。影響物體的光線數量沒有限制,並且採用逐畫素的方式評估所有光照,這意味著這些光照將全部與法線貼圖準確互動。此外,所有光照都可有 cookie 和陰影。

延時光照有這樣一個優點:無論光線照射的物體數量是多少,光照的處理開銷與螢幕上的光線尺寸成正比。因此,保持較小的光線尺寸可提高效能。延時光照還有高度一致和可預測的行為。每束光線的效果都是按逐畫素光照計算的,因此不會出現在大三角形等上崩潰的光照計算。

延時光照的缺點是沒有實際的抗鋸齒支援,也不能處理半透明物體(這些必須使用“正向渲染”(Forward Rendering) 來渲染)。同時不支援網格渲染器 (Mesh Renderer) 的接收陰影 (Receive Shadows) 標識,並且剔除遮蔽圖的支援方式也有限。(具體而言,您最多可以使用四個剔除遮蔽圖。即:剔除層遮蔽圖必須至少包含減去 4 個任意層後的所有層,所以 32 層中必須設定 28 層。否則會得到圖形假象。)

要求

延時光照只能用於 Unity 專業版。延時光照要求 Shader Model 3.0(或更高版本)的圖形卡,並且支援深度 (Depth) 渲染紋理和雙面模板緩衝區。大多數 2004 年後製作的圖形卡都支援延時光照,包括 GeForce FX 或其更高版本、Radeon X1300 或其更高版本、Intel 965 / GMA X3100 或其更高版本。然而,目前移動平臺和 Flash 平臺都不支援延時光照。

效能注意事項

延時光照中實時光線的渲染開銷與光線照射的畫素數量成正比,而非取決於場景的複雜性。所以微小點或者聚光燈耗費的渲染資源非常少。如果它們被場景物體完全或部分遮住,甚至會更加便宜。

當然,帶陰影的光源比不帶陰影的光源要昂貴許多。延時光照中,陰影投射物體仍需為每個陰影投射光進行一次或多次渲染。而且,產生陰影的光照著色器的渲染開銷比禁用陰影時使用的光照著色器更高。

實施細節

當使用延時光照 (Deferred Lighting) 時,Unity 中的渲染過程分為三步,如下所示:-

  1. 基礎通道:渲染物體以生成帶有深度、法線和高光強度的螢幕空間緩衝區。
  2. 光照通道:使用上一步生成的緩衝區將光照計算到另一個螢幕空間的快取區中。
  3. 最終通道:再次渲染物體。將已計算好的光照取出並與顏色紋理混合,然後新增任何環境/放射性光照。

帶有不能處理延時光照著色器的物體在該過程完成後會使用正向渲染路徑進行渲染。

基礎通道

基礎通道對每個物件渲染一次。檢視空間法線和高光強度被渲染進單個 ARGB32 渲染紋理中(法線在 RGB 通道、高光強度在 A 通道)。如果平臺和硬體支援將 Z 緩衝區讀取為紋理,那麼深度不會進行明確渲染。如果 Z 緩衝區不能以紋理的方式進行訪問,則用著色器替換在其他某個渲染通道中渲染深度。

基礎通道的結果是被螢幕內容填滿的 Z 緩衝區以及帶有法線和高光強度的渲染紋理 (Render Texture)。

光照通道

光照通道根據深度、法線和高光強度計算光照。光照是在螢幕空間中計算的,因此所需的處理時間與螢幕複雜性無關。光照緩衝區是單獨的 ARGB32 渲染紋理 (Render Texture),紋理的 RGB 通道有漫反射光照,A 通道有單色高光光照。光照值採用對數值編碼,從而提供比 ARGB32 紋理通常所能達到的動態範圍更廣的動態範圍。延時渲染的唯一光照模式是 Blinn-Phong。

沒有跨越相機近平面的點光源和聚光燈被渲染成三維形狀,並啟用針對場景的 Z 緩衝區測試。這使部分或全部遮擋住的點光源和聚光燈所耗費的渲染資源很少。跨越近平面的方向燈或點光源/聚光燈被渲染成全屏四邊形。

如果光源開啟陰影,則這些光源會在此通道中加以渲染和應用。請注意陰影並不是“免費”的,需要渲染陰影投射器並運用更加複雜的光線著色器。

可用的唯一光照模式為 Blinn-Phong。如果想要不同的模式,可以通過將內建著色器中修改後的 Internal-PrePassLighting.shader 檔案版本放置到“資產”資料夾中名為“資源”的資料夾來修改光照通道著色器。

最終通道

最終通道生成最終渲染影象。所有物體都將用著色器再次渲染,其中著色器將採集光照,將光照與紋理混合,並新增任何放射性光照。光照貼圖也會應用到最終通道中。靠近相機時使用實時光照,並只新增烘焙反射光照。這樣做可交叉淡化成遠離相機的全烘焙光照。

正向渲染路徑細節

本頁面描述了正向 (Forward) 渲染路徑的細節。

根據影響物件的光源的不同,正向渲染 (Forward Rendering) 路徑在一個或多個通道中渲染每個物件。根據設定和強度,光源本身也會受到正向渲染 (Forward Rendering) 的不同處理。

實施細節

在正向渲染 (Forward Rendering) 中,影響每個物件的一定數量的最亮光源以全逐畫素光照模式被渲染。然後,最多 4 個點光燈會逐頂點被計算。其他燈根據球諧函式 (SH) 進行計算,這種計算方式更快速,但只能得到近似值。根據以下內容判斷某個光源是否是逐畫素光源:

  • 渲染模式 (Render Mode) 設定為不重要 (Not Important) 的光源通常是逐頂點或球諧函式。
  • 最亮的方向燈通常為逐畫素。
  • 渲染模式 (Render Mode) 設定為重要 (Important) 的光源通常是逐畫素。
  • 如果以上內容導致光源數量小於當前畫素光源數量 (Pixel Light Count) 質量設定,則為了降低亮度,會有更多的光源以逐畫素的方式進行渲染。

用以下方法渲染每個物件:

  • 基礎通道 (Base Pass) 應用一個逐畫素方向燈以及所有逐頂點/球諧函式光源。
  • 其他逐畫素光源在其他通道中進行渲染,一個通道對應一個光源。

例如,如果某個物件受到若干光源的影響(下圖中的圓圈受到光源 A 到 光源 H 的影響):

假設光源 A 到 光源 H 具有相同的顏色和強度,且他們的渲染模式都為自動 (Auto) 模式,則他們在該物件上將嚴格按照這種順序進行排序。最亮的光源將以逐畫素光照模式進行渲染(A 到 D),然後最多 4 個光源以逐頂點光照模式進行渲染(D 到 G),剩下的光源以球諧函式進行渲染(G 到 H):

請注意不同的光照組間有重疊。例如,最後一個逐畫素光源混合有逐頂點光照模式,這樣能減少物件和光源移動時可能出現的“光照跳躍”現象。

基礎通道

基礎通道用一個逐畫素方向燈和所有球諧函式光源渲染物件。該通道還從著色器中新增任何光照貼圖、環境光照和放射性光照。該通道中渲染的方向燈可以有陰影 (Shadows)。請注意,使用了光照貼圖的物件不會獲得來自球諧函式光源的光照。

附加通道

附加通道為影響該物件的每個附加逐畫素光源進行渲染。這些通道中的光源不能有陰影(因此,正向渲染 (Forward Rendering) 支援一個帶陰影的方向燈)。

效能注意事項

球諧函式光源渲染地快。它們只耗費很少的 CPU,並且實際上無需耗費 GPU(換言之,基礎通道通常計算球諧函式光照,但由於球諧函式光照的執行方式,無論有多少球諧函式光源,耗費都是完全相同的)。

球諧函式光源的缺點有:

  • 它們計算的是物件的頂點,而非畫素。這意味著它們不支援燈光 Cookies 或法線貼圖。
  • 球諧函式光源的頻率很低。球諧函式光源無法有明顯的照明過渡。它們也只會影響漫反射光照(對高光亮點來說,球諧函式光照的頻率過低)。
  • 球諧函式光照不是區域性的;靠近某些表面的球諧函式點光燈或聚光燈“看起來彆扭”。

總的說來,球諧函式燈對小的動態物件來說已經足夠好了。

頂點光照渲染路徑細節

本頁面描述了頂點光照 (Vertex Lit) 渲染路徑的細節。

頂點光照 (Vertex Lit) 路徑通常在一個通道中渲染每個物件,所有光源的照明都在物件頂點上進行計算。

頂點光照 (Vertex Lit) 路徑通常在一個通道中渲染每個物件,所有光源的照明都在物件頂點上進行計算。

由於所有的光照都在頂點層級上計算,所以此渲染路徑不支援大多數的逐畫素渲染效果:如陰影、法線貼圖、燈光 Cookie、高精度的高光亮點。

渲染路徑比較

延遲光照 正向渲染 頂點光照
功能
逐畫素光照(法線貼圖和燈光 cookies) -
實時陰影 1 束平行光 -
雙重光照貼圖 - -
深度與法線緩衝區 額外渲染通道 -
軟粒子 - -
半透明物體 -
抗鋸齒 -
光照剔除遮蔽圖 受限
光照保真度 全部逐畫素 部分逐畫素 全部逐頂點
效能
逐畫素光照的成本 照亮的畫素數 畫素數 * 照亮的物件數 -
支援平臺
PC (Windows/Mac) Shader Model 3.0+ Shader Model 2.0+ 所有平臺
移動平臺 (iOS/Android) - OpenGL ES 2.0 OpenGL ES 2.0 & 1.1
控制檯 360, PS3 360, PS3 -