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...
Mesh level of detail (LOD)
Level of detail (LOD) is one of the most important ways to optimize rendering performance in a 3D project, along with Occlusion culling.
In questa pagina imparerai:
How mesh LOD can improve your 3D project's rendering performance.
How to set up mesh LOD in Godot.
How to measure mesh LOD's effectiveness in your project (and alternatives you can explore if it doesn't meet your expectations).
Vedi anche
È possibile osservare il funzionamento dei LOD delle mesh in azione attraverso il progetto demo Occlusion Culling and Mesh LOD.
Introduzione
Historically, level of detail in 3D games involved manually authoring meshes with lower geometry density, then configuring the distance thresholds at which these lower-detailed meshes should be drawn. This approach is still used today when increased control is needed.
However, in projects that have a large amount of detailed 3D assets, setting up LOD manually can be a very time-consuming process. As a result, automatic mesh decimation and LOD configuration is becoming increasingly popular.
Godot offre un modo per generare automaticamente mesh meno dettagliate per l'utilizzo con i livelli di dettaglio (LOD) durante l'importazione, per poi utilizzare automaticamente tali mesh LOD quando necessario. Questo processo è completamente trasparente per l'utente. La libreria meshoptimizer è utilizzata per generare le mesh LOD dietro le quinte.
I LOD di mesh funzionano con qualsiasi nodo che disegna mesh 3D, inclusi MeshInstance3D, MultiMeshInstance3D, GPUParticles3D e CPUParticles3D.
Confronto visivo
Ecco un esempio di mesh LOD generate durante l'importazione. Saranno utilizzate mesh con un livello di dettaglio inferiore quando la telecamera è lontana dall'oggetto:
Dalla più dettagliata (a sinistra) alla meno dettagliata (a destra), vista ombreggiata
Ecco la stessa immagine con il rendering fildiferro per rendere più evidente la decimazione:
Dal più dettagliato (sinistra) al meno dettagliato (destra), vista fildiferro
Vedi anche
Se è necessario configurare manualmente il livello di dettaglio con mesh create da un artista, usare Campi di visibilità (HLOD) invece dei LOD di mesh automatici.
Generazione di LOD mesh
Per impostazione predefinita, la generazione dei LOD della mesh avviene automaticamente per le scene 3D importate (glTF, .blend, Collada, FBX). Una volta generate, le mesh dei LOD saranno utilizzate automaticamente durante il rendering della scena. Non c'è bisogno di configurare altro manualmente.
Tuttavia, la generazione dei LOD della mesh non avviene automaticamente per le mesh 3D importate (OBJ). Questo perché i file OBJ non sono importati come scene 3D complete, come predefinito, ma solo come singole risorse mesh da caricare in un nodo MeshInstance3D (o GPUParticles3D, CPUParticles3D, ...).
Per generare i LOD di mesh per un file OBJ, selezionalo nel pannello FileSystem, vai al pannello Importazione, cambia l'opzione Importa come in Scene, quindi clicca su Reimporta:
Cambio del tipo di importazione su un file OBJ nel pannello Importazione
Sarà necessario riavviare l'editor dopo aver cliccato su Reimporta.
Nota
Il processo di generazione dei LOD della mesh non è perfetto e può occasionalmente avere problemi di rendering (soprattutto nelle mesh con skin). La generazione dei LOD può inoltre richiedere un bel po' di tempo sulle mesh complesse.
Se i LOD della mesh causano l'aspetto incorretto di una mesh specifica, è possibile disabilitare la generazione dei LOD nel pannello Importazione. Ciò velocizzerà anche l'importazione delle risorse. Questa operazione si può eseguire globalmente nelle opzioni di importazione della scena 3D o per ogni singola mesh attraverso la finestra Impostazioni di importazione avanzate.
Consulta Importing 3D scenes per maggiori informazioni.
Comparing mesh LOD visuals and performance
Per disabilitare il LOD delle mesh nell'editor per fare confronti, utilizzare la modalità di disegno di debug avanzata Disattiva i LOD delle mesh. Lo si può fare tramite il menu nell'angolo in alto a sinistra della viewport 3D (etichettato Prospettiva o Ortogonale a seconda della modalità della telecamera):
Disabilitazione dei LOD delle mesh nel menu in alto a sinistra della viewport 3D
Abilita Vedi tempo di frame nello stesso menu per visualizzare gli FPS nell'angolo in alto a destra. Abilita anche Vedi informazioni nello stesso menu per visualizzare il numero di primitive (vertici + indici) renderizzate nell'angolo in basso a destra.
Se i LOD delle mesh funzionano correttamente nella scena e la telecamera è abbastanza lontana dalla mesh, dovresti notare una diminuzione del numero di primitive disegnate e un aumento degli FPS quando i LOD delle mesh rimane abilitato (a meno che non ci sia un collo di bottiglia sulla CPU).
Per vedere la decimazione dei LOD delle mesh in azione, cambia la modalità di disegno di debug in Visualizza in fildiferro nel menu specificato sopra, poi regola l'impostazione del progetto Rendering > Mesh LOD > Cambio di LOD > Soglia in pixel.
Configurare le prestazioni e la qualità del LOD delle mesh
È possibile regolare l'aggressività delle transizioni LOD di mesh nella viewport radice modificando l'impostazione del progetto Rendering > Mesh LOD > Cambio di LOD > Soglia in pixel. Per modificare questo valore in fase di esecuzione, impostare mesh_lod_threshold nella viewport radice come segue:
get_tree().root.mesh_lod_threshold = 4.0
GetTree().Root.MeshLodThreshold = 4.0f;
Ogni viewport ha la sua proprietà mesh_lod_threshold, che si può impostare indipendentemente dalle altre viewport.
La soglia predefinita degli LOD, pari a 1 pixel, è ottimizzata per apparire percettivamente senza perdite; migliora molto le prestazioni con una perdita di qualità impercettibile. Valori più elevati faranno avvenire le transizioni tra gli LOD prima quando la telecamera si allontana, migliorando le prestazioni, ma riducendo la qualità.
Se è necessario fare aggiustamenti per ogni oggetto al LOD delle mesh, è possibile regolare l'aggressività delle transizioni tra i LOD modificando la proprietà LOD Bias su qualsiasi nodo che eredita da GeometryInstance3D. Valori superiori a 1.0 faranno avvenire le transizioni più tardi del solito (ottenendo maggiore qualità, ma prestazioni inferiori). Valori inferiori a 1.0 faranno avvenire le transizioni prima del solito (ottenendo minore qualità, ma prestazioni superiori).
Inoltre, i nodi ReflectionProbe hanno una propria proprietà Mesh LOD Threshold che si può regolare per migliorare le prestazioni di rendering quando la sonda di riflessione si aggiorna. Ciò è particolarmente importante per i ReflectionProbe che utilizzano la modalità di aggiornamento Always.
Nota
Durante il rendering della scena, la selezione del LOD delle mesh utilizza una metrica basata sullo spazio dello schermo. Ciò significa che tiene automaticamente conto del campo visivo della telecamera e della risoluzione della viewport. Un campo visivo più ampio e una risoluzione più bassa renderanno la selezione del LOD più aggressiva; il motore visualizzerà i modelli fortemente semplificati più presto quando la telecamera si allontana.
Pertanto, a differenza di Campi di visibilità (HLOD), non è necessario fare nulla di specifico nel progetto per tenere conto del campo visivo della telecamera e della risoluzione della viewport.
Utilizzare gli LOD di mesh con MultiMesh e particelle
Per la selezione dei LOD, è utilizzato come base il punto dell'AABB del nodo più vicino alla telecamera. Questo si applica a qualsiasi tipo di LOD di mesh (inclusi i singoli MeshInstance3D), ma ha alcune implicazioni per i nodi che visualizzano più mesh alla volta, come MultiMeshInstance3D, CPUParticles3D e GPUParticles3D. Ancora più importante, ciò significa che tutte le istanze saranno disegnate con lo stesso livello di LOD in un determinato momento.
Se noti una selezione LOD errata con GPUParticles3D, assicurati che la AABB di visibilità del nodo sia configurata selezionando il nodo GPUParticles3D e utilizzando GPUParticles3D > Genera AABB nella parte superiore della viewport 3D.
Se in un MultiMesh ci sono istanze distanti tra loro, è consigliabile posizionarle in un nodo MultiMeshInstance3D separato. Ciò migliorerà anche le prestazioni di rendering, poiché il frustum culling e l'occlusion culling saranno in grado di scartare i singoli nodi (mentre in un MultiMesh non possono scartare le singole istanze).