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...
Campi di visibilità (HLOD)
Insieme a Mesh level of detail (LOD) e Occlusion culling, gli intervalli di visibilità sono un altro mezzo per migliorare le prestazioni in scene 3D grandi e complesse.
In questa pagina imparerai:
Cosa possono fare i campi di visibilità e in quali scenari sono utili.
Come impostare i campi di visibilità (LOD manuali) in Godot.
Come regolare i campi di visibilità per ottenere le migliori prestazioni e qualità.
Vedi anche
Se hai solo bisogno che le mesh diventino meno dettagliate a distanza, ma non hai mesh LOD create manualmente, considera di affidarti al Mesh level of detail (LOD) automatico.
Nota che è possibile utilizzare contemporaneamente gli LOD automatici e i campi di visibilità, anche sulla stessa mesh.
Come funziona
I campi di visibilità si possono usare con qualsiasi nodo che eredita da GeometryInstance3D. Ciò significa che si possono usare non solo con MeshInstance3D e MultiMeshInstance3D per HLOD controllati da un artista, ma anche con GPUParticles3D, CPUParticles3D, Label3D, Sprite3D, AnimatedSprite3D e CSGShape3D.
Poiché i campi di visibilità sono configurati per ogni nodo, è possibile utilizzare diversi tipi di nodi come parte di un sistema LOD. Ad esempio, è possibile visualizzare un'istanza MeshInstance3D che rappresenta un albero da vicino, e sostituirla con un impostore Sprite3D da lontano per migliorare le prestazioni.
Il vantaggio di HLOD rispetto a un sistema LOD tradizionale è la sua natura gerarchica. Una singola mesh più grande può sostituire diverse mesh più piccole, in modo da ridurre il numero di draw call a distanza, ma preservare le opportunità di culling da vicino. Ad esempio, è possibile avere un gruppo di case che utilizza singoli nodi MeshInstance3D (uno per ogni casa) da vicino, ma si trasforma in un singolo nodo MeshInstance3D che rappresenta un gruppo di case meno dettagliato (oppure utilizzare un nodo MultiMeshInstance3D).
Lastly, visibility ranges can also be used to fade certain objects entirely when the camera gets too close or too far. This can be used for gameplay purposes, but also to reduce visual clutter. For example, Label3D nodes can be faded using visibility ranges when they're too far away to be readable or relevant to the player.
Configurazione del campo di visibilità
Questa è una guida rapida su come configurare un sistema di LOD basilare. Dopo aver seguito questa guida, il sistema di LOD visualizzerà una SphereMesh quando la telecamera è vicina e una BoxMesh quando è lontana abbastanza. È inoltre configurato un piccolo margine di isteresi tramite le proprietà Begin Margin e End Margin. Questo impedisce che i LOD cambino troppo rapidamente quando la telecamera si muove al "bordo" della transizione tra gli LOD.
Le proprietà che riguardano l'intervallo di visibilità si trovano nella sezione Visibility Range nell'ispettore di GeometryInstance3D dopo aver selezionato il nodo MeshInstance3D.
Aggiungi un nodo Node3D che servirà per raggruppare i due nodi MeshInstance3D.
Aggiungi un primo nodo MeshInstance3D come figlio del Node3D. Assegna una nuova SphereMesh alla sua proprietà Mesh.
Per l'intervallo di visibilità del primo MeshInstance3D, imposta End su
10.0e End Margin su1.0.Aggiungi un secondo nodo MeshInstance3D come figlio del Node3D. Assegna un nuovo BoxMesh alla sua proprietà Mesh.
Per l'intervallo di visibilità del secondo MeshInstance3D, imposta Begin su
10.0e Begin Margin su1.0.Muovi la telecamera avanti e indietro dall'oggetto. Nota come l'oggetto passerà da una sfera a un cubo man mano che la telecamera si allontana.
Proprietà del campo di visibilità
Nell'ispettore di qualsiasi nodo che eredita da GeometryInstance3D, è possibile regolare le seguenti proprietà nella sezione Visibility Range di GeometryInstance3D:
Inizio: l'istanza verrà nascosta quando la telecamera è più vicina al centro dell'AABB (bounding box allineato agli assi) dell'istanza rispetto a questo valore (in unità 3D).
Begin Margin: The hysteresis or alpha fade transition distance to use for the close-up transition (in 3D units). The behavior of this property depends on Fade Mode.
End: l'istanza verrà nascosta quando la telecamera è più lontana dal centro dell'AABB dell'istanza di questo valore (in unità 3D).
End Margin: The hysteresis or alpha fade transition distance to use for the far-away transition (in 3D units). The behavior of this property depends on Fade Mode.
Fade Mode: controlla come effettuare la transizione tra i livelli di LOD. Vedi sotto per i dettagli.
Modalità di dissolvenza
Nota
La modalità di dissolvenza selezionata ha un impatto evidente solo se Visibility Range > Begin Margin o Visibility Range > End Margin è maggiore di 0.0.
Nella sezione Campo di visibilità dell'ispettore, è possibile scegliere tra 3 modalità di dissolvenza:
Disabled: Uses hysteresis to switch between LOD levels instantly. This prevents situations where LOD levels are switched back and forth quickly when the player moves forward and then backward at the LOD transition point. The hysteresis distance is determined by Visibility Range > Begin Margin and Visibility Range > End Margin. This mode provides the best performance as it doesn't force rendering to become transparent during the fade transition.
Self: Uses alpha blending to smoothly fade between LOD levels. The node will fade-out itself when reaching the limits of its own visibility range. The fade transition distance is determined by Visibility Range > Begin Margin and Visibility Range > End Margin. This mode forces transparent rendering on the object during its fade transition, so it has a performance impact.
Dependencies: Uses alpha blending to smoothly fade between LOD levels. The node will fade-in its dependencies when reaching the limits of its own visibility range. The fade transition distance is determined by Visibility Range > Begin Margin and Visibility Range > End Margin. This mode forces transparent rendering on the object during its fade transition, so it has a performance impact. This mode is intended for hierarchical LOD systems using Visibility parent. It acts the same as Self if visibility ranges are used to perform non-hierarchical LOD.
Genitore di visibilità
La proprietà Visibility Parent rende più facile configurare l'HLOD. Consente di nascondere automaticamente i nodi figli se il loro genitore è visibile, a seconda delle proprietà attuali di intervallo di visibilità.
Nota
L'obiettivo di Visibility Parent deve ereditare da GeometryInstance3D.
Nonostante il nome, la proprietà Visibility Parent può puntare a un nodo che non è un genitore del nodo nell'albero di scene. Tuttavia, è impossibile puntare Visibility Parent a un nodo figlio, poiché ciò crea un ciclo di dipendenze non supportato. Apparirà un messaggio di errore nel pannello Output se avviene un ciclo di dipendenze.
Dato il seguente albero di scene (dove tutti i nodi ereditano da GeometryInstance3D):
┖╴BatchOfHouses
┠╴House1
┠╴House2
┠╴House3
┖╴House4
In questo esempio, BatchOfHouses è una grande mesh progettata per rappresentare tutti i nodi figli quando visti da lontano. House1 a House4 sono MeshInstance3D più piccole che rappresentano le singole case. Per configurare l'HLOD in questo esempio, dobbiamo configurare solo due cose:
Imposta Visibility Range Begin su un numero maggiore di 0.0 in modo che BatchOfHouses appaia solo quando è abbastanza lontana dalla telecamera. Al di sotto di questa distanza, vogliamo invece che siano visualizzate House1 a House4.
In House1 a House4, assegna la proprietà Visibility Parent su BatchOfHouses.
Questo rende più facile fare aggiustamenti in seguito, poiché non serve più regolare Visibility Range Begin di BatchOfHouses e Visibility Range End di House1 a House4.
La modalità di dissolvenza è gestita automaticamente dalla proprietà Visibility Parent, in modo che i nodi figli diventino nascosti solo quando il nodo genitore è completamente svanito. Questo serve a ridurre al minimo l'effetto pop-in. A seconda della configurazione dell'HLOD del tuo sistema, potresti voler provare entrambe le modalità di dissolvenza Self e Dependencies.
Nota
I nodi nascosti tramite la proprietà Visible sono essenzialmente rimossi dall'albero delle dipendenze di visibilità, pertanto le istanze dipendenti non terranno conto del nodo nascosto o dei suoi antenati.
In pratica, significa che se l'obiettivo del nodo Visibility Parent è nascosto impostando la sua proprietà Visible su false, il nodo non verrà nascosto in base al valore Visibility Range Begin specificato nel nodo genitore di visibilità.
Consigli di configurazione
Utilizza materiali più semplici a distanza per migliorare le prestazioni
Un modo per migliorare ulteriormente le prestazioni è utilizzare materiali più semplici per le mesh LOD distanti. Sebbene l'utilizzo di mesh LOD riduca il numero di vertici da renderizzare, il carico di ombreggiatura per pixel dei materiali rimane identico. Tuttavia, tale carico è spesso un collo di bottiglia per la GPU in scene 3D complesse. Un modo per ridurre questo carico sulla GPU è utilizzare materiali più semplici quando non fanno molta differenza visiva.
Bisogna misurare con attenzione i miglioramenti sulle prestazioni ottenuti in questo modo, poiché aumentare il numero di materiali unici in una scena ha di per sé un impatto sulle prestazioni. Tuttavia, utilizzare materiali più semplici per le mesh LOD distanti può comunque portare a migliori prestazioni grazie al minor numero di calcoli richiesti per ogni pixel.
Ad esempio, sui materiali utilizzati dalle mesh LOD distanti, è possibile disabilitare funzionalità costose dei materiali come:
Mappa di normali (soprattutto per le piattaforme mobili)
Rim
Rivestimento trasparente
Anisotropia
Altezza
Subsurface Scattering
Illuminazione posteriore
Rifrazione
Dissolvenza in prossimità
Utilizza dithering per le transizioni tra LOD
Attualmente Godot supporta solo la dissolvenza basata sul canale alfa per gli intervalli di visibilità. Tuttavia, è possibile utilizzare il dithering come alternativa, utilizzando materiali diversi per i vari livelli LOD.
There are two advantages to using dithering over alpha blending for LOD transitions:
Higher performance, as dithering transparency is faster to render compared to alpha blending.
Nessun problema visivo dovuto a problemi di ordinamento della trasparenza durante le transizioni tra gli LOD.
Lo svantaggio del dithering è che, durante le transizioni di dissolvenza tra gli LOD, è visibile un motivo "rumoroso". Questo potrebbe non essere altrettanto evidente a risoluzioni più alte della viewport o quando l'antialiasing temporale è abilitato.
Inoltre, poiché la dissolvenza basata sulla distanza in BaseMaterial3D supporta solo la dissolvenza da vicino o da lontano, questa configurazione è più adatta se composta da solo due LOD.
Assicurati che Begin Margin e End Margin siano impostati su
0.0su entrambi i nodi MeshInstance3D, poiché l'isteresi o la dissolvenza alfa non sono desiderate in questo caso.Su entrambi i nodi MeshInstance3D, diminuisci Begin della distanza di transizione di dissolvenza desiderata e aumenta End della stessa distanza. Questo è necessario affinché la transizione di dithering sia effettivamente visibile.
Sull'oggetto MeshInstance3D visualizzato da vicino, modifica il suo materiale nell'ispettore. Imposta la modalità Distance Fade su Object Dither. Imposta Min Distance sullo stesso valore della fine (End) dell'intervallo di visibilità. Imposta Max Distance sullo stesso valore meno la distanza di transizione della dissolvenza.
Sull'oggetto MeshInstance3D visualizzato da lontano, modifica il suo materiale nell'ispettore. Imposta la modalità Distance Fade su Object Dither. Imposta Min Distance sullo stesso valore dell'inizio (Begin) dell'intervallo di visibilità. Imposta Max Distance sullo stesso valore più la distanza di transizione della dissolvenza.