這篇文章將 帶大家了解團結引擎虛擬幾何體(Virtual Geometry)功能的基礎知識、相關工具及操作方法,包括在團結引擎中開啟虛擬幾何體、模型導入,以及 Editor 中的 Profiler、View Mode、Picking 工具簡介。通過靈活地對 VG 相關設置進行調控,團結引擎將協助大家在渲染性能和畫面效果中取得良好平衡。團結引擎將協助大家再渲染性能和畫面效果
VG 系列視頻教程現已上線 Unity 中文課堂、 Unity 官方 Bilibili,點擊以下鏈接即可免費學習:
Unity中文課堂 - 團結引擎虛擬幾何體入門教程
https://learn.u3d.cn/tutorial/tuanjie-virtual-geometry
Bilibili - 團結引擎虛擬幾何體教程合集
https://www.bilibili.com/video/BV1A6uvzLEd4/?spm_id_from=333.1387.collection.video_card.click&vd_source=6ad5666ecbc7fe0e80d963da7e237d92
模型導入與 VG 使用
在團結引擎中打開 Project Settings-Graphics,勾選 Virtual Geometry 開關后重啟 Editor,即可開啟全局 VG。
![]()
導入模型時會生成對應 VG 需要的 cluster 數據,Model Importer 中的 VG 選項也會自動勾選。場景中生成模型對應的 Mesh Render, Mesh Render 的 VG 也會自動開啟,且這一選項可以自由開關。
但因為導入模型時沒有導入 Geometry Buffer,在關閉 Mesh Render 的 VG 選項后無法正常渲染。此時需要勾選 Project Settings-Graphics 中 Virtual Geometry 下方的 Keep Geometry Buffer 選項或是 Model Importer 里的 Allow VG Switch 選項來生成兩份模型相關數據,一份是 VG 需要的 cluster 數據,另一份是正常渲染的頂點和索引信息。兩個選項的區別是 Keep Geometry Buffer 是全局開關,開啟后所有導入的 VG Mesh 都會生成兩份模型相關數據,而 Allow VG Switch 只針對當前導入的模型去生成兩份數據。在一般情況下,我們建議只有真的需要對某一個模型進行 VG 跟非 VG 的切換,或是場景中同時存在該模型對應的 VG 和非 VG 的 Renderer 時,才將這個開關進行打開,從而通過避免生成兩份模型數據來減少內存消耗,并取得最好的性能效果。
![]()
![]()
虛擬幾何體相關選項
Ignore Simple Mesh:開啟這個選項后,如果當前模型包含一些面片數較少的submesh,那么模型導入時會跳過這些 submesh 的 VG 數據生成,從而提升性能。
Allow VG Switch:允許用戶在運行時逐模型動態切換 Mesh Render 的 VG 開關。Project Settings-Player Settings-Virtual Geometry Runtime 也是一個類似的開關,開啟該開關后,當我們 build 出包時,包中也會含有 VG 相關數據。而如果這個設置是關閉狀態,那么在運行時我們將無法獲取 VG 相關數據,也無法進行 VG 渲染。
Surface Compensation:該選項用于提升 alpha test 相關的 VG 植被在離攝像機較遠時的渲染效果,避免離攝像機較遠時相關植被出現稀疏的情況,從而提升渲染效果。
Position/Normal/Tangent Precision Options:這三個選項是跟頂點精度相關的,當頂點精度越高時,模型就會越還原,占用的內存也就會越大,所以用戶可以根據實際需要進行動態的精度調控。如果不想操心相關的精度設置,可以選擇默認的 auto 選項,選擇該選項之后,相關的模型將會根據其模型復雜度選擇合適的精度進行渲染。
VG 與 LOD Group
開啟了 VG 的模型會通過其自適應的 LOD 算法進行合適的 cluster 層級的選擇。因此這一套系統和當前 Editor 中已有的 LOD Group 這一個 component 是互斥的。如果我們開啟了 LOD Group 中的 Virtual Geometry 選項,那么當前這個 LOD Group 下只會有 LOD0 對應的 Mesh Renderer 的 VG 選項被打開,而剩下的 LOD1 到 LOD3 相應的 MeshRenderer 將會被關閉。我們渲染這個 LOD Group 時也只會渲染 LOD0 對應的 VG 模型。此時我們也無法控制當前 LOD group 下 Mesh Renderer 的 VG 開關,而只能通過 LOD group 的 VG 開關進行統一的 VG 控制,從而保證 LOD Group 行為的一致性。
![]()
VG Buffer
在 Project Settings-Quality 中,我們還保留了跟 VG buffer 相關的設置,從而允許用戶根據項目和平臺的需要動態調控 VG buffer 的大小。
![]()
Persistent Buffer:存放了當前場景中所有 VG 物體渲染所需最少量的數據,因此如果這個 buffer 越大,那么場景中所能包含的 VG instance 也就越多。
Streaming Buffer:存儲了一幀中渲染所需要的所有 VG 數據,當畫面的分辨率越高,場景中的 VG 物體越多,模型越復雜時,這個 buffer 的大小也就需要越大,以容納所有 VG 相關數據。
Profiler
Stats
在編輯器中,切換到 Game View 窗口下,打開 Stats 面板可以看到兩行數據:
Enabled Virtual Geometry Renderers:渲染的所有 Renderer 中打開虛擬幾何體功能的數量。
Disabled Virtual Geoemetry Renderers:渲染的所有 Renderer 中關閉虛擬幾何體功能的數量。
Profiler
在 Windows=>Analysis=>Profiler 中的 Rendering 區域,可以查看虛擬幾何體相關的渲染數據。
![]()
從上到下分別記錄了:
繪制 VBuffer 的 Draw Call 數量和繪制的三角形預估數量;
虛擬幾何體繪制的 GBuffer 的 Draw Call 數量;
當前幀統計的 Cluster 數量、經過 Main Cull 后繪制的 Cluster 數量、經過 Post Cull 后繪制的 Cluster 數量。Main Cull 和 Post Cull 后繪制的 Cluster 數量相加即是當前幀 VBuffer 繪制的 Cluster 數量;
當前幀虛擬幾何體上傳到顯存的總數據量、當前幀虛擬幾何體上傳到顯存的 Cluster 數據量;
虛擬幾何體所使用的 Buffer 占用的顯存總量。
同時,虛擬幾何體的部分數據還會在 Rendering 區域中以折線圖的形式展示。
Profiler 也能夠連接打包后的程序,進行虛擬幾何體相關的渲染性能分析。需要在打包選項中勾選上 Development Build 和 AutoConnect Profiler。在完成打包后,保持編輯器開啟狀態,并打開程序,即可在 Profiler 中逐幀進行查看相關數據。
![]()
Draw Mode
Draw Mode 指的就是 Scene View 窗口中的這個按鈕,在這個按鈕下有多個選項可以幫助我們查看場景中各類光照信息。
![]()
Shaded Mode:默認為最基礎的渲染。
Wireframe:可以看到場景中所有繪制的 mesh 的線框。

Wireframe
Shaded Wireframe:把 Wireframe 覆蓋在了普通渲染上面,和之前的類似。
![]()
Shaded Wireframe
Contributors/Receivers:這個模式下會繪制三種不同的顏色,黃色代表這個 instance 上 Contribute Global Illumination 這個選項沒有被勾選,藍色代表這個選項被勾選了并且接收的是 lightmap,紅色代表的是這個選項被勾選了并且接收的是 lightprobe。這個選項方便我們快速查看場景中 renderer 對于 GI 的設置。
![]()
Contributors/Receivers
Baked Lightmap:繪制那些接收 Lightmap 的 renderer 上面接收到的 Lightmap 的狀態,可以查看在這里烘焙出的 Lightmap 是怎么應用在物體上的,也可以檢查烘焙的過程中烘焙光是否有誤。
![]()
Baked Lightmap
Directionality:在烘焙 lightmap 的過程中,我們會生成兩張紋理,第一個紋理代表的是物體表面接收到的光照強度和顏色的信息,也就是 Baked Lightmap。第二張紋理存儲的是物體表面接收到的最主要的光的矢量方向,在當前模式下看到的就是這張方向紋理應用于物體上的狀態,這同樣可以檢查烘焙光的問題。
![]()
Directionality
Shadow Mask:當我們的 Lighting mode 是 Shadow Mask 時,烘焙 Lightmap 就會烘焙出第三張紋理,代表陰影遮罩,可以看到烘焙陰影應用于當前場景的狀態。大部分物體處于深灰色的狀態,代表沒有直接光照射到物體上,則其上應該有烘焙陰影。有不同顏色的部分代表接收到了來自不同光源的直接光。
![]()
Shadow Mask
Albedo:代表了烘焙 lightmap 的物體在烘焙時貢獻的反照率,與物體的材質相關。
![]()
Albedo
Emissive:代表了烘焙 lightmap 的物體在烘焙時發出的自發光,也與材質有關。
![]()
Emissive
UV Charts:這個模式下場景中的物體會被繪制為不同顏色,每一個顏色都代表了一個 UV 島,處于相同的 UV 島的位置在 Lightmap 上是連續存在的。通過觀察 UV 的分布,可以合理分配 Lightmap 的分辨率。
![]()
UV Charts
Texel Validity:這個模式中只會繪制紅色和綠色兩種顏色,紅色代表在烘焙的時候,某個 texel 因為主要看到背面而標記為無效,這些標記為紅色的位置,采用相鄰有效的 texel 進行替換。
![]()
Texture Validity
UV Overlap:如果兩個位置在 lightmap 上的 UV 離得太近,那么在采樣的時候就可能會出現滲色的情況。這個模式標記了可能會出現問題的位置,可以檢查 UV 相關的問題。
![]()
UV Overlap
Lightmap Indices:這個模式下,不同的顏色代表了某個位置烘焙在了哪一張不同的 Lightmap 之上。
![]()
Lightmap Indices
Picking
Picking 就是當我們點擊 scene view 中的某一個位置時,引擎可以知道我們選中了哪個物體并將它突出顯示的能力。而 VG 的 picking 就是指我們選中 VG 物體的能力。例如當我們點擊場景中的這個 VG 雕像,它的輪廓就會被顯示出來。
![]()
在使用上, VG 的 picking 和非 VG 物體的 picking 完全一致。例如,當點擊有子節點的物體時,顯示藍色,而無子節點的物體則顯示黃色。在 hierarchy 面板中關閉 VG 物體的 picking 按鈕,就無法再在 scene view 中選中該 VG 物體。
![]()
Picking按鈕
原有的 Picking 流程
當點擊 scene view 的某個位置時,例如點擊一個 VG 雕像,就會以鼠標位置為中心創建一個 4 × 4 大小的 viewport 以及渲染紋理 RT。通過對 scene view 的原投影矩陣做一定的縮放和平移,我們可以獲取到這個小視口對應的投影矩陣。
首先根據這個新的投影矩陣對場景進行 frustum cull,獲取小視口內的所有物體,例如此處的雕像以及它背后的階梯和地面等等。并將它們從近到遠進行排序,然后遍歷所有物體,根據它的 index 編碼出唯一的顏色,并通過光柵化將其顏色渲染到 RT 上。最后 CPU 回讀這張渲染紋理,獲取出現次數最多的顏色,解碼顏色,得出對應的 object index。這樣一來就獲取到了選中的物體,然后渲染其輪廓,就實現了 picking。
團結引擎的 VG Picking
我們將 VG 的 picking 放在了 CPU 端的 frustum cull 和 CPU 回讀兩步之間。在進行 frustum cull 后,獲取到視口內的所有 VG 物體,記錄其編碼的顏色,并將其排除出原有的渲染流程。然后開始做 VG 在 GPU 端的 instance cull、cluster cull 和 cluster indirect draw。在 instance cull 中我們建立起 VG instance 與其編碼顏色的對應關系,然后 cluster cull 做默認的裁剪操作。最后在渲染 cluster 時找到所屬的 VG instance,獲取其編碼顏色并寫入到 RT 上,這樣在 CPU 回讀 RT 后也能獲取到選中的 VG 物體,從而實現了 VG 的 picking。
Unity 官方微信
第一時間了解Unity引擎動向,學習進階開發技能
每一個“點贊”、“在看”,都是我們前進的動力

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.