Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
網格的細節級別(LOD)¶
與 遮擋剔除 一樣,細節級別(LOD)是優化 3D 專案渲染性能的最重要方法之一。
在本指南中,我們將學到:
網格 LOD 如何提高 3D 專案的渲染性能。
如何在 Godot 中設定網格 LOD。
如何衡量網格 LOD 在專案中的效果(如果達不到預期效果,還可以探索其他方法)。
也參考
除了這份說明文件,你可能也會想看看 Godot Demo 專案 。
前言¶
從歷史上看,3D 遊戲中的細節層次包括手動繪製幾何密度較低的網格,然後配置距離閾值,在距離閾值上繪製這些細節較低的網格。如今,當需要加強控制時,這種方法仍在使用。
然而,在擁有大量詳細 3D 素材的專案中,手動設定 LOD 可能是一個非常耗時的過程。因此,自動網格細分和 LOD 配置越來越受歡迎。
Godot 提供了一種方法,可以在匯入時自動生成細節較少的網格供 LOD 使用,然後在需要時自動使用這些 LOD 網格。這對使用者完全透明。meshoptimizer 庫用於幕後的 LOD 網格生成。
網格 LOD 適用於任何繪製 3D 網格的節點。這包括 MeshInstance3D、MultiMeshInstance3D、GPUParticles3D 和 CPUParticles3D。
視覺比較¶
以下是匯入時生成 LOD 網格的範例。當相機遠離物體時,將使用細節較少的網格:
這是使用線框渲染的同一張圖像,以使抽取更容易看到:
也參考
如果您需要使用藝術家建立的網格手動配置細節級別,請使用 doc_visibility_ranges 而不是自動網格 LOD。
建立內容¶
預設情況下,匯入的 3D 場景(glTF、.blend、Collada、FBX)會自動產生網格 LOD。 LOD 網格產生後,渲染場景時將自動使用它們。您無需手動配置任何內容。
但是,對於匯入的 3D 網格 (OBJ),網格 LOD 產生**不會**自動發生。這是因為預設情況下,OBJ 檔案不會作為完整的 3D 場景匯入,而僅作為單獨的網格資源載入到 MeshInstance3D 節點(或 GPUParticles3D、CPUParticles3D...)中。
若要使OBJ 檔案為其產生網格LOD,請在檔案系統擴充座中選擇它,請前往匯入擴充塢,將其**匯入為** 選項變更為**場景**,然後按一下**重新匯入**:
這將需要在單擊“重新匯入”後重新啟動編輯器。
備註
網格 LOD 生成過程並不完美,有時可能會引入渲染問題(尤其是在蒙皮網格中)。在複雜的網格上,網格 LOD 產生也可能需要一段時間。
如果網格 LOD 導致特定網格看起來損壞,您可以在匯入塢中停用它的 LOD 產生。這也將加快資源匯入速度。這可以在 3D 場景的匯入選項中全域完成,也可以使用「進階匯入設定」對話方塊在每個網格上完成。
請參考 在編輯器中運作程式碼 以瞭解詳情。
比較網格 LOD 視覺效果和性能¶
若要在編輯器中停用網格 LOD 以進行比較,請使用 停用網格 LOD 進階偵錯繪製模式。這可以使用 3D 視窗左上角的選單來完成(標記為 透視 或 正交,取決於相機模式):
在同一選單中啟用**查看影格時間**可在右上角查看 FPS。也可以在同一選單中啟用**查看資訊**,以查看右下角渲染的像素(頂點+索引)的數量。
如果網格LOD 在您的場景中正常工作,並且您的相機距離網格足夠遠,您應該會注意到,當網格LOD 保持啟用狀態時,繪製的像素數量會減少,而FPS 會增加(除非您遇到CPU 瓶頸)。
若要查看網格LOD 抽取的實際效果,請在上面指定的選單中將偵錯繪製模式變更為**顯示線框**,然後調整**渲染> 網格LOD > LOD 變更> 閾值像素** 專案設定。
配置網格 LOD 性能和質量¶
您可以透過變更 渲染 > 網格 LOD > LOD 變更 > 閾值像素 專案設定來調整根視窗中網格 LOD 過渡的激程序度。若要在執行時變更此值,請在根視窗上設定``mesh_lod_threshold``,如下所示:
get_tree().root.mesh_lod_threshold = 4.0
每個視窗都有自己的「mesh_lod_threshold」屬性,可以獨立於其他視窗進行設定。
預設網格 LOD 閾值 1 像素經過調整,看起來「感知上」無損;它提供了顯著的性能提升,但品質卻有不明顯的損失。當相機移開時,較高的值將使 LOD 過渡更快發生,從而導致更高的性能但品質較低。
如果需要對網格 LOD 執行每個物件的調整,則可以透過調整繼承自 GeometryInstance3D 的任何節點上的 LOD Bias 屬性來調整 LOD 過渡的激程序度。 *高於*``1.0`` 的值將使 LOD 轉換比平常晚發生(導致品質更高但性能更低)。 *低於*``1.0`` 的值將使 LOD 轉換比平常更快發生(導致品質較低但效能較高)。
此外,ReflectionProbe 節點具有自己的 網格 LOD 閾值 屬性,可在反射探查更新時對其進行調整以提高渲染效能。這對於使用 Always 更新模式的 ReflectionProbes 尤其重要。
備註
渲染場景時,網格 LOD 選擇使用螢幕空間度量。這意味著它會自動考慮相機視野和視口解析度。較高的相機 FOV 和較低的視口解析度將使 LOD 選擇更加積極;當相機移開時,引擎將提前顯示嚴重破壞的模型。
因此,與 doc_visibility_ranges 不同,您無需在專案中執行任何特定操作即可考慮相機 FOV 和視窗解析度。
將網格 LOD 與 MultiMesh 和粒子結合使用¶
對於 LOD 選擇,節點的 AABB(軸對齊邊界框)最接近相機的點用作基礎。這適用於任何型別的網格 LOD(包括單一 MeshInstance3D),但這對於同時顯示多個網格的節點(例如 MultiMeshInstance3D、GPUParticles3D 和 GPUParticles3D)有一些影響。最重要的是,這意味著在給定時間所有實例都將使用相同的 LOD 層級進行繪製。
如果您發現 GPUParticles3D 的 LOD 選擇不正確,請確保透過選擇 GPUParticles3D 節點並使用 3D 視窗頂部的 GPUParticles3D > 產生 AABB 來配置節點的可見性 AABB。
如果 MultiMesh 中的執行個體彼此距離較遠,則應將它們放置在單獨的 MultiMeshInstance3D 節點中。這樣做還將提高渲染效能,因為視錐體和遮蔽剔除將能夠剔除單一節點(儘管它們無法剔除 MultiMesh 中的單一實例)。