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,請在檔案系統擴充座中選擇它,請前往匯入擴充塢,將其**匯入為** 選項變更為**場景**,然後按一下**重新匯入**:

在匯入塢中變更 OBJ 檔案的匯入型別

在匯入塢中變更 OBJ 檔案的匯入型別

這將需要在單擊“重新匯入”後重新啟動編輯器。

備註

網格 LOD 生成過程並不完美,有時可能會引入渲染問題(尤其是在蒙皮網格中)。在複雜的網格上,網格 LOD 產生也可能需要一段時間。

如果網格 LOD 導致特定網格看起來損壞,您可以在匯入塢中停用它的 LOD 產生。這也將加快資源匯入速度。這可以在 3D 場景的匯入選項中全域完成,也可以使用「進階匯入設定」對話方塊在每個網格上完成。

請參考 在編輯器中運作程式碼 以瞭解詳情。

比較網格 LOD 視覺效果和性能

若要在編輯器中停用網格 LOD 以進行比較,請使用 停用網格 LOD 進階偵錯繪製模式。這可以使用 3D 視窗左上角的選單來完成(標記為 透視正交,取決於相機模式):

在 3D 視口左上角的選單中禁用網格 LOD

在 3D 視口左上角的選單中禁用網格 LOD

在同一選單中啟用**查看影格時間**可在右上角查看 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 中的單一實例)。