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.

Limitazioni del rendering 3D

Introduzione

Poiché danno priorità alle prestazioni, i motori di rendering in tempo reale hanno numerose limitazioni. Il renderer di Godot non fa eccezione. Per lavorare efficacemente con tali limitazioni, è necessario comprenderle.

Limiti di dimensioni delle texture

Su desktop e laptop, le texture con risoluzioni superiori a 8192×8192 potrebbero non essere supportate sui dispositivi più vecchi. È possibile verificare le limitazioni della GPU di interesse su GPUinfo.org.

Le GPU per i dispositivi mobili sono in genere limitate a texture di 4096×4096 pixel. Inoltre, alcune GPU per i dispositivi mobili non supportano texture ripetute di dimensioni che non sono potenze di due. Pertanto, se si desidera che la texture sia visualizzata correttamente su tutte le piattaforme, è consigliabile evitare di usare texture più grandi di 4096×4096 pixel e usare dimensioni pari a potenze di due se la texture deve ripetersi.

Per limitare le dimensioni di una specifica texture che potrebbe essere troppo grande da renderizzare, è possibile impostare l'opzione di importazione Process > Size Limit su un valore maggiore di 0. Facendo così, le dimensioni della texture saranno ridotte durante l'importazione (mantenendo le proporzioni) senza influire sul file sorgente.

Color banding

Quando si utilizzano i metodi di rendering Forward+ o Mobile, il motore 3D di Godot renderizza internamente in HDR. Tuttavia, il risultato del rendering sarà solitamente scritto in un buffer a precisione più bassa. Ciò può far comparire bande visibili, soprattutto quando si usano materiali senza texture. Per motivi di prestazioni, anche la precisione del colore è più bassa quando si utilizza il metodo di rendering Mobile in confronto a Forward+.

Quando si utilizza il metodo di rendering Compatibilità, Il rendering interno in HDR non è utilizzato e la precisione del colore è la più bassa tra tutti i metodi di rendering. Questo vale anche per il rendering 2D, dove potrebbero comparire bande quando si usano texture con gradienti uniformi.

Esistono due modi principali per alleviare il banding:

  • Se si utilizzano i metodi di rendering Forward+ o Forward Mobile, abilitare Usa Debanding in Impostazioni del progetto > Rendering > Anti-aliasing. Questo applica uno shader di debanding a schermo intero come effetto di post-elaborazione ed è molto performante.

  • Alternativamente, incorporare qualche rumore nelle proprie texture. Questo è particolarmente efficace in 2D, ad esempio per gli effetti di vignettatura. In 3D, è possibile anche usare uno shader di debanding personalizzato da applicare ai propri materiali. Questa tecnica funziona anche se il progetto è renderizzato con una bassa precisione del colore, il che significa che funzionerà utilizzando i metodi di rendering Mobile e Compatibilità.

Confronto di bande di colore (contrasto aumentato per maggiore visibilità)

Confronto di bande di colore (contrasto aumentato per maggiore visibilità)

Vedi anche

Consultare Banding in Games: A Noisy Rant (PDF) per maggiori dettagli sul banding e sui modi per contrastarlo.

Precisione del buffer di profondità

Per ordinare gli oggetti nello spazio 3D, i motori di rendering si affidano a un buffer di profondità (chiamato anche Z-buffer). Questo buffer ha una precisione finita: 32 bit sulle piattaforme desktop, 24 bit sulle piattaforme mobili (per motivi di prestazioni). Se due oggetti diversi finiscono sullo stesso valore nel buffer, avviene lo Z-fighting. Questo si manifesta con uno sfarfallio delle texture quando la telecamera si muove o ruota.

Per rendere il buffer di profondità più preciso sull'area renderizzata, bisognerebbe aumentare la proprietà Near del nodo Camera. Tuttavia, attenzione: se impostata su un valore troppo alto, i giocatori potranno vedere attraverso la geometria circostante. Bisognerebbe anche diminuire la proprietà Far del nodo Camera al valore minimo accettabile per la situazione, tenendo presente però che ciò non influirà sulla precisione tanto quanto la proprietà Near.

Se hai bisogno di alta precisione solo quando il giocatore può vedere lontano, potresti cambiarla dinamicamente in base alle condizioni di gioco. Ad esempio, se il giocatore sale su un aereo, la proprietà Near si può temporaneamente aumentare per evitare il problema del "Z-fighting" a distanza. Poi si poi diminuire una volta che il giocatore scende dall'aereo.

A seconda della scena e delle condizioni di visualizzazione, potrebbe essere possibile allontanare di più gli oggetti in Z-fighting senza che la differenza sia evidente al giocatore.

Confronto di Z-fighting (prima e dopo aver ritoccato la scena scostando il Label3D lontano dal pavimento)

Confronto di Z-fighting (prima e dopo aver ritoccato la scena scostando il Label3D lontano dal pavimento)

Ordinamento della trasparenza

In Godot, i materiali trasparenti sono disegnati dopo quelli opachi. Gli oggetti trasparenti sono ordinati in avanti prima di essere disegnati in base alla posizione del Node3D, non alla posizione dei vertici nello spazio globale. Per questo motivo, è possibile che gli oggetti sovrapposti siano ordinati incorrettamente. Per correggerli, modifica la proprietà Render Priority del materiale o Sorting Offset del nodo. La priorità di rendering forza materiali specifici a comparire davanti o dietro altri materiali trasparenti, mentre l'offset di ordinamento sposta l'oggetto avanti o indietro per l'ordinamento. Anche così, non sempre queste impostazioni potrebbero bastare.

Gli oggetti trasparenti non sono renderizzati nel buffer di normali-rugosità, poiché sono disegnati dopo la geometria opaca. Pertanto, le funzionalità che dipendono dal buffer di normali-rugosità non influiranno sui materiali trasparenti.

Alcuni motori di rendering includono tecniche di trasparenza indipendente dall'ordine per mitigare il problema, ma questo è costoso per la GPU. Godot attualmente non offre questa funzionalità. Esistono comunque diversi modi per evitarlo:

  • Rendere trasparenti i materiali solo se effettivamente necessario. Se un materiale ha solo una piccola parte trasparente, si consideri di suddividerla in un materiale separato. Questo permetterà alla parte opaca di proiettare ombre e migliorerà anche le prestazioni.

  • Se la propria texture ha principalmente aree completamente opache e completamente trasparenti, si potrebbe utilizzare il test alfa anziché fusione alfa. Questa modalità di trasparenza è più veloce da renderizzare e non presenta problemi di trasparenza. Abilita Transparency > Transparency su Alpha Scissor in StandardMaterial3D e regola Transparency > Alpha Scissor Threshold adeguatamente, se necessario. Si noti che l'MSAA non applicherà l'antialiasing ai bordi della texture a meno che l'antialiasing alfa non sia abilitato nelle proprietà del materiale. Tuttavia, l'FXAA, il TAA e il sovracampionamento saranno in grado di applicare l'antialiasing ai bordi della texture, a prescindere dal fatto che l'antialiasing alfa sia abilitato sul materiale.

  • Se è necessario renderizzare aree semitrasparenti della texture, la modalità ritaglio alfa non è adatta. Al suo posto, impostare la proprietà Transparency > Transparency dello StandardMaterial3D su Depth Pre-Pass può talvolta funzionare (a scapito delle prestazioni). Si potrebbe anche provare la modalità Alpha Hash.

  • Se si desidera che un materiale si dissolva con la distanza, utilizzare la modalità di dissolvenza a distanza Pixel Dither o Object Dither dello StandardMaterial3D anziché Pixel Alpha. Questo renderà il materiale opaco, velocizzando anche il rendering.

Transparency sorting comparison (alpha-blended materials on the left, alpha scissor materials on the right)

Transparency sorting comparison (alpha-blended materials on the left, alpha scissor materials on the right)