Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
網格的細節級別(LOD)
與 遮蔽剔除 一樣,細節級別(LOD)是優化 3D 專案算繪性能的最重要方法之一。
在本指南中,我們將學到:
網格 LOD 如何提高 3D 專案的算繪性能。
如何在 Godot 中設定網格 LOD。
如何衡量網格 LOD 在專案中的效果(如果達不到預期效果,還可以探索其他方法)。
也參考
你可以參考 Occlusion Culling and Mesh LOD 範例專案,實際觀察網格 LOD 的運作。
前言
過去 3D 遊戲的細節層次(LOD)通常需美術手動建立低多邊形版本的網格,並設定這些網格在哪些距離門檻時切換顯示。當專案需要更精細的控制時,這種方式至今仍被採用。
然而,在擁有大量詳細 3D 素材的專案中,手動設定 LOD 可能是一個非常耗時的過程。因此,自動網格細分和 LOD 配置越來越受歡迎。
Godot 提供匯入時自動產生低細節網格(LOD)的方法,並會在需要時自動切換使用這些 LOD 網格,對使用者來說完全透明。幕後會使用 meshoptimizer 函式庫進行 LOD 網格的產生。
網格 LOD 適用於任何繪製 3D 網格的節點。這包括 MeshInstance3D、MultiMeshInstance3D、GPUParticles3D 和 CPUParticles3D。
視覺比較
以下是匯入時生成 LOD 網格的範例。當相機遠離物體時,將使用細節較少的網格:
從最詳細(左)到最不詳細(右),陰影視圖
這是使用線框算繪的同一張圖像,以使抽取更容易看到:
從最詳細(左)到最不詳細(右),線框視圖
也參考
如果你需要針對美術手動製作的多版本網格自行設定 LOD,請使用 可見範圍(HLOD),而非自動網格 LOD。
產生網格 LOD
預設情況下,匯入的 3D 場景(如 glTF、.blend、Collada、FBX)會自動產生網格 LOD。生成 LOD 網格後,場景在繪製時會自動套用這些網格,無需手動設定。
但是,對於匯入的 3D 網格 (OBJ),網格 LOD 產生**不會**自動發生。這是因為預設情況下,OBJ 檔案不會作為完整的 3D 場景匯入,而僅作為單獨的網格資源載入到 MeshInstance3D 節點(或 GPUParticles3D、CPUParticles3D...)中。
若要使OBJ 檔案為其產生網格LOD,請在檔案系統擴充座中選擇它,請前往匯入擴充塢,將其**匯入為** 選項變更為**場景**,然後按一下**重新匯入**:
在匯入塢中變更 OBJ 檔案的匯入型別
點擊 重新匯入 後,會需要重新啟動編輯器。
備註
網格 LOD 生成過程並不完美,有時可能會引入算繪問題(尤其是在蒙皮網格中)。在複雜的網格上,網格 LOD 產生也可能需要一段時間。
如果網格 LOD 導致特定網格看起來損壞,您可以在匯入塢中停用它的 LOD 產生。這也將加快資源匯入速度。這可以在 3D 場景的匯入選項中全域完成,也可以使用「進階匯入設定」對話方塊在每個網格上完成。
詳情請參考 使用模組。
比較網格 LOD 視覺效果和性能
若要在編輯器中停用網格 LOD 以進行比較,請使用 停用網格 LOD 進階偵錯繪製模式。這可以使用 3D 視窗左上角的選單來完成(標記為 透視 或 正交,取決於相機模式):
透過 3D 視口左上角的選單停用網格 LOD
在同一選單中啟用 顯示影格時間 來在右上角查看 FPS,也可以啟用 顯示資訊,以在右下角看到目前算繪的 primitive(頂點數+索引數)。
如果你的場景中網格 LOD 正常運作,而且相機距離網格夠遠,當 LOD 啟用時,你應該會發現算繪的 primitive 數量減少、FPS 上升(除非你遇到 CPU 瓶頸)。
若要觀察網格 LOD 的抽取(decimation)效果,可以在上述選單切換到 顯示線框 偵錯模式,然後調整 算繪 > Mesh LOD > LOD 切換 > Threshold Pixels 專案設定。
配置網格 LOD 性能和質量
你可以透過調整專案設定的 算繪 > Mesh LOD > LOD 切換 > Threshold Pixels,決定主視口中網格 LOD 切換的敏感程度。若要於執行時動態調整,可以對 root 視口的 mesh_lod_threshold 屬性設定如下:
get_tree().root.mesh_lod_threshold = 4.0
GetTree().Root.MeshLodThreshold = 4.0f;
每個視口(Viewport)都擁有獨立的 mesh_lod_threshold 屬性,可各自調整,不互相影響。
預設的網格 LOD 閾值為 1 像素,目的是讓畫面在*感知上*接近無損,同時獲得顯著的效能提升且幾乎無畫質損失。提高這個值會讓 LOD 切換在相機遠離時更早發生,提升效能但畫質會下降。
如果你需要針對單一物件調整 LOD 切換的積極程度,可以在繼承自 GeometryInstance3D 的節點上設定 LOD 偏差(LOD Bias) 屬性。設定值*大於* 1.0 會讓 LOD 切換比預設更晚(畫質較高、效能較低),小於 1.0 則會讓 LOD 更早切換(畫質較低、效能較高)。
此外,ReflectionProbe 節點有自己的 Mesh LOD Threshold(網格 LOD 閾值) 屬性,調整這個值可以提升反射探測器更新時的算繪效能。這對於設定為 Always (永遠)更新模式的 ReflectionProbe 特別重要。
備註
算繪場景時,網格 LOD 選擇使用螢幕空間度量。這意味著它會自動考慮相機視野和視口解析度。較高的相機 FOV 和較低的視口解析度將使 LOD 選擇更加積極;當相機移開時,引擎將提前顯示嚴重破壞的模型。
因此,與 可見範圍(HLOD) 不同,您無需在專案中執行任何特定操作即可考慮相機 FOV 和視窗解析度。
將網格 LOD 與 MultiMesh 和粒子結合使用
For LOD selection, the point of the node's AABB that is the closest to the camera is used as a basis. This applies to any kind of mesh LOD (including for individual MeshInstance3D)s, but this has some implications for nodes that display multiple meshes at once, such as MultiMeshInstance3D, CPUParticles3D, and GPUParticles3D. Most importantly, this means that all instances will be drawn with the same LOD level at a given time.
如果你發現 GPUParticles3D 的 LOD 選擇不正確,請選取 GPUParticles3D 節點,並在 3D 視口上方選單使用 GPUParticles3D > 產生 AABB,以正確設定節點的可見範圍 AABB。
如果 MultiMesh 中的實例彼此距離很遠,建議將它們分開放到不同的 MultiMeshInstance3D 節點。這麼做能讓視錐體與遮蔽剔除能針對單一節點進行(而非 MultiMesh 內的單一實例無法被剔除),進一步提升算繪效能。