1. 程式人生 > >unity GPU優化(Occlusion Culling遮擋剔除,LOD多細節層次,GI(Global Illumination)全域性光照)

unity GPU優化(Occlusion Culling遮擋剔除,LOD多細節層次,GI(Global Illumination)全域性光照)

渲染管線:

定義:圖形資料在CPU上經過運算處理,最後輸出到螢幕的過程 

1. 頂點處理:接收模型頂點資料、座標系轉換

2. 圖元裝配:組裝面、連線相鄰的頂點,繪製為三角面

3. 光柵化:計算三角面上的畫素,併為後面著色階段提供合理的插值引數(以及深度值)

4. 畫素處理:對每個畫素區域進行著色、寫入到快取中

5. 快取:一個儲存畫素資料的記憶體塊,最重要的快取是幀快取與深度快取

• 幀快取:儲存每個畫素的色彩(緩衝)

• 深度快取 Z—buffer:前後排序(深度資訊,物體到攝像機的距離)

Draw Call繪製呼叫:每幀呼叫顯示卡渲染物體的次數 

一.Occlusion Culling遮擋剔除:

定義:當物體被送進渲染流水線之前,

將視錐以內看不到的物體進行剔除,減少每幀的渲染量,提高渲染效能 

例一:unity自帶的Occlusion Culling(用碰撞實現的)很消耗GUP

步驟:

1.在Window中找到並點選Occlusion Culling

2.把需要進行渲染剔除的物體勾選為Static

3.在右邊的Occlusion中選中Object->Occlusion Areas點選Create new Occlusion Areas

4.在Object中點選Bake,和在Bake中點選Bake

5.點選Visuslization和移動相機就可以檢視效果了

效果展示:(相機沒有看到的物體自動把MeshRander隱藏了)

例項二:用InstantOC(使用射線)檢測物體

步驟

下載:AssetStore中下載InstantOC_Dynamic_Occlusion_Culling__LOD_v2.0.0.unitypackage外掛

百度雲連結:連結:http://pan.baidu.com/s/1jHPrAfG  密碼:v0yr

1.建立層

2.為遊戲物體指定層(將參與遮擋剔除)與標籤(將自動附加 IOClod指令碼)

3.物體新增碰撞器Collider元件(通過射線去檢測物體)

4.攝像機附加指令碼IOCcam

屬性

確保剔除物體顯示正常的陰影。Layer mask:參與遮擋剔除的遊戲物件層。

IOC Tag:將為指定標籤的遊戲物件自動新增IOClod指令碼物件。

Samples:每幀攝像機發射的射線數目。數量多剔除效果 好,但效能開銷大。通常在150—500之間。

Rays FOV:射線視野,應大於攝像機視野Field of View。

View Distance:檢視距離,射線長度。將影響攝像機Clipping Planes –Far 數值。

Hide Delay:延遲隱藏,當物體被剔除時延遲的幀數,建 議50—100之間。

•PreCullCheck:檢查採集資訊,建議勾選,可以提高剔除 效率。

•RealtimeShadows:實時陰影,如果場景需要實時陰影, 建議啟用,

注意:(物體需要新增Box Collider元件) 

缺點:需要消耗額外CUP 

適用:存在大量被遮擋的物體時使用 

BUG:Realtime Shadows——使用會顯示材質丟失

優點:減少渲染壓力,優化GPU顯示

效果圖:

標記的物體沒有被遮擋時

標記的物體被遮擋了

二.LOD多細節層次:

定義:根據物體模型的節點在顯示環境中所處的位置 和重要度,決定物體渲染的資源分配,降低非重要物體的面數 和細節度,從而獲得高效率的渲染運算。(降低非重要物體(遠距離物體)的頂點數 (近精模 遠簡模))

步驟

1.建立層

2.建立空物體並將模型新增到其中,命名為:Lod_0  Lod_1 Lod_2

3.為父物體指定層與標籤

4.父物體或子物體新增碰撞器元件

5.攝像機附加指令碼IOCcam

屬性

Lod1 distance:攝像機到物體距離小於當前距離時,使 用Lod_0模型。

Lod2 distance:攝像機到物體距離大於Lod1且小於當前 距離時,使用Lod_1模型,大於當前值使用Lod_2模型。

LodMargin:LOD邊緣,如果物體在LOD各階段過渡時發 生閃爍,嘗試提高當前值。

缺點:消耗CPU判斷距離、佔用記憶體、需要三個模型(付費的不需要三個) 

適用:高面模型比較多、有遠近變化 

效能優化: 

CPU、渲染、記憶體 

例項:

三.GI(Global Illumination)全域性光照:

•簡稱GI,即全域性光照。

•能夠計算直接光、間接光、環境光以及反射光的光照系統。

•通過GI演算法可以使渲染出來的光照效果更為真實豐富。

直接光照

定義:從光源直接發出的光,通過Light元件實現。

Type 型別:燈光物件的當前型別

--DirectionalLight 平行光:平行發射光線,可以照射場 景裡所有物體,用於模擬太陽。

--PointLight 點光源:在燈光位置上向四周發射光線,可 以照射其範圍內的所有物件,用於模擬燈泡。

--SpotLight 聚光燈:在燈光位置上向圓錐區域內發射光 線,只有在這個區域內的物體才會受到光線照射,用於模擬探照燈。

--Area Light區域光:由一個面向一個方向發射光線,只照射該區域內物體,僅烘焙時有效,用在光線較為集中的區域。(僅烘焙用,極耗效能)

Range 範圍:光從物體的中心發射的範圍。僅適用於點光源和聚光燈。

Spot Angle 聚光角度:燈光的聚光角度。只適用於聚光燈。

Color 顏色:光線的顏色。

Intensity強度:光線的明亮程度。

Culling Mask 選擇遮蔽層: 選擇要照射的層Layer。

練習:為場景新增光源 

陰影(直接光照)

•Shadow Type 陰影型別:Hard 硬陰影、Soft 軟陰影(軟陰影較硬陰影更消耗效能 )

--Strength 硬度:陰影的黑暗程度。

--Resolution解析度:設定陰影的細節程度。

--Bias 偏移:物體與陰影的偏移。

•GameObject通過Mesh Renderer 元件啟用/禁用陰影

--Cast / Receive Shadows 當前物體是否投射/接收陰影。

--Off 不投射陰影,On 投射陰影,Two Sided 雙面陰影,

Shadows Only 隱藏物體只投射陰影

•陰影剔除:設定顯示陰影的距離

Edit->Project Settings->Quality->Shadows Disdance

Tips:光可以設定陰影、物體可以選擇是否渲染陰影、陰影剔除可以選擇渲染的距離

間接光照

定義:物體表面在接受光照後反射出來的光。

•通過Light 元件中Bounce Intensity 反彈強度控制。

•可以通過Scene 面板Irradiance 模式檢視間接光照。

Tips:只有標記LightmapingStatic 的物體才能產生間接反彈光照。(要把物體設定為Static——靜態——才能使用間接光)

最不好實現,需要消耗大量效能計算(預計算)

環境光照

定義:作用於場景內所有物體的光照

通過Environment Lighting 中Ambient 控制。

來源:天空盒、梯度顏色、顏色 

•Ambient Source 環境光源

--Skybox 通過天空盒顏色設定環境光照

--Gradient 梯度顏色

Sky 天空顏色、Equator 地平線顏色、Ground 地面顏色

--Ambient Color 純色

•Ambient Intensity 環境光強度

•Ambient GI  環境光GI模式

--Realtime實時更新,環境光源會改變選擇此項。

--Backed 烘焙,環境光源不會改變選擇此項。

反射光照

定義:根據天空盒或立方體貼圖計算的作用於所有物體的反射效果

通過Environment Lighting 中Reflection 控制。

•Reflection Source 反射源

--Skybox 天空盒

Resolution 解析度Compression 是否壓縮

--Custom 自定義

Cubemap立方體貼圖

•Reflection Intensity 反射強度

•Reflection Bounces 使用Reflection Probe 後允許不同遊戲物件間來回反彈的次數。

烘焙GI:

烘焙:Lightmap

原定義:當場景包含大量物體時,實時光照和陰影對遊戲效能有很大影響。使用烘焙技術,可以將光線效果預渲染成貼圖再 作用到物體上模擬光影,從而提高效能。適用於在效能較 低的裝置上執行的程式。

簡述:將光線效果預渲染成貼圖再作用到物體上模擬光影,從而提高效能,適合在效能較低的裝置上使用

Tips:手遊一般用烘焙GI)

烘焙後的貼圖儲存在Unity同目錄下 

步驟

1. 遊戲物件設定為LightmapingStatic。

2. 設定Light元件Baking屬性。

3. 啟用Lighting 面板的Baked GI。

4. 點選Build按鈕。(如果勾選Auto 編輯器會自動檢測場 景的改動修復光照效果)

例:

根據上面的步驟:

遊戲物件(Cube/Sphere)設定為LightmapingStatic。

建立兩個SpotLight聚光燈光源

一個光源的Mode設定為Baked之後在Window Lighting-->Settings中設定

移動該光源下的Sphere可以知道 該Sphere的陰影固定在了Plane上,這是因為Baked僅烘焙時起作用,之後就是一張Texture3D貼圖(你可以把該光源刪除,理解更容易)

另一個光源的Mode改為Mixed測試

移動下面的Sphere檢視其特性

•Light 元件Baking 屬性:烘焙模式

--Realtime僅實時光照時起作用。

--Baked僅烘焙時起作用。

--Mixed 混合,烘焙與實時光照都起作用。

•可以通過Scene 面板Baked 模式檢視光照貼圖。

Baked GI

•Baked Resolution:烘焙光照貼圖解析度,建議比實時GI 解析度高10倍。

•Baked Padding:光照貼圖中各形狀間距,取值2到200。

 

•Compressed:是否壓縮光照貼圖,壓縮則提高效能,縮小容量,但畫質會降低。

 

•Ambient Occlusion:環境遮擋表面的相對亮度,值越高 遮擋處和完全曝光處區別越大,建議為1。

 

•Final Gather:選中後提高烘焙質量,但會消耗更多時間。

•Atlas Size:光照貼圖尺寸。

General GI

•常規GI設定,同時適用於實時GI與烘焙GI。

•Directional Mode 定向模式:

--Non– Directional 無定向模式,使用1種光照貼圖儲存 光照資訊。

--Directional 定向模式,使用2種光照貼圖儲存光照資訊, 相比之下效果更好,但空間佔用更大。

--Direction Specular 定向反射模式,使用4種光照貼圖存 儲光照資訊,效果最好,但佔用空間最大。

•除無定向模式外必須執行在GLES2.0與SM2.0以上的裝置。

GLES 指OpenGL ES 針對移動端,從iPhone5s 開始支援;

SM 指ShaderModel 針對PC 端,目前大部分顯示卡支援。

•Indirect Intensity 最終間接光照、反射光照的強度。1為默 認強度,小於1則減低強度,大於1則增大強度。

•Bounce Boost 增強間接光照。

•Default Parameters 高階GI引數。

--Default 預設

--Default –HighResolution高解析度

--Default –LowResolution低解析度

--Default –VeryLowResolution非常低的解析度

烘焙後會產生LightingData(燈光資訊,匹配圖片)

光照貼圖


批處理

1、DrawCall(繪製呼叫Draw Call):每次引擎準備資料(頂點資訊,不是面數資訊)並通知GPU的過程。通俗講,每幀呼叫顯示卡渲染物體的次數。CPU每幀呼叫圖形學介面,由圖形學介面通知GPU做圖形渲染的過程。DrawCall變多,CPU每幀呼叫的次數變多,幀率(FPS每秒幀數)變少,卡頓現象的。決定一個DrawCall的是資源,一個圖片資源放到多個場景物體中不會增加DrawCall。

2、DrawCall位置:遊戲執行時看Statics:, 為優化的DrawCall數。Profiler面板中的Total Batches的資料才是準確的DrawCall數。

3、DrawCall的優化(又稱為批處理),分為兩種:靜態(Batching)批處理、動態(Dynamic)批處理。動態批處理:可以將符合批處理原則的模型合併,合併後這些模型的DrawCall為一個。 Batched DrawCalls參與動態批處理的物體數量(合併的DrawCall數量),Bacthes降低DrawCall的兩種方式:精靈打包、圖集。【注意:貼圖不影響DrawCall,一個模型更換貼圖DrawCall不變,材質才影響DrawCall,給一個Cube加多維子材質,每個面有一個Standard材質,則場景中因為Cube存在增加6個DrawCall】

3.1動態批處理的條件:並不是所有的模型都可以參與動態批處理,不是所有的模型都符合動態批處理條件。滿足動態批處理的條件:

①場景中存在攝像機;

②模型的頂點數在300個頂點以內。

③與材質的Shader有關,如果材質的Shader是單通道,則可以參與動態批處理,如果是多通道,則不參與動態批處理。(一個Pass佔用一個DrawCall,至少要開啟一個通道才能將模型渲染出來,最基礎的是漫反射通道(Base Map佔用),如果給模型添加了反射、折射、透明、高光等貼圖,則Shader中開啟對應通道,則不能開啟動態批處理,與模型中材質的個數無關,與每個材質中是否有多通道有關);

④Transform元件中的Scale會影響批處理,Rotate、Position不會影響批處理。模型的縮放在不同的Unity版本中會有影響,如果模型的縮放倍數不是很大的話可以參與批處理,倍數過大可能就不能參與批處理。

⑤如果一個模型標記為靜態,無論什麼型別的靜態,則不能參與動態批處理;

⑥只有用Mesh Renderer渲染顯示的模型才能參與動態批處理,Skinned Mesh Renderer渲染顯示的模型不能參與動態批處理。

⑦Unity中提供的模型與3Ds Max中的模型不能一同參與動態批處理,即使使用同樣的材質。所以專案中不要用Unity自帶的模型。只要用同一個材質,即使網格不相同,只要頂點數少於300,也能一同參與動態批處理。

3.2、靜態批處理滿足的條件:

①模型必須是靜態的才可以參與批處理。

②頂點數無要求。

③對通道無要求,多通道也可以參與靜態批處理;

④參與燈光烘焙的模型(標記為靜態)也可以用靜態批處理;

⑤網格渲染元件也必須是Mesh Renderer;

⑥Transform元件也不影響靜態批處理(縮放範圍別過大即可)。

3.3、遇到模型頂點數很多的時候需要用動態批處理的做法:

①將模型打散成多個子物體,每個子物體的定點數小於300;

②利用多維子材質,給模型的所有子物體賦同一個多維子材質球,每一個材質球的都為單通道的即可。

3.4、當場景中有多類武器,每類武器會同時在場景中存在多個的情況時,就可以利用動態批處理。

3.5、批處理只能降低DrawCall不能降低CPU計算的頂點數。不能光盯著DrawCall的優化,要兼顧頂點的優化,頂點數多CPU計算量同樣會上升。

3.3、天空盒佔用一個DrawCall,因為天空盒的CubeMap用了一個單通道的Shader。

3.4靜態物體不能動態載入。

4、什麼情況下需要把小圖的標籤設定為一個(打包):圖片的型別、壓縮方式、透明、是否在同一個介面等可以放到一張大圖中。如果一張圖片在幾個介面都用,不如不打包這張圖片了,Unity打包策略:儘量將所有圖放到一張大圖中,圖片過多放到多個包中。

5、圖集:

6、因為每一個小方格都有單獨,單獨做成類。

7、讀取單個精靈用Load,讀取精靈圖集用LoadAll。

8、所有資料中,能快速定位資料的為字典集合,比陣列快多了。
--------------------- 
作者:leonardo_Davinci 
來源:CSDN 
原文:https://blog.csdn.net/leonardo_Davinci/article/details/78516955?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!