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.

Introduzione all'illuminazione globale

Che cos'è l'illuminazione globale?

Illuminazione globale è un termine generico utilizzato per descrivere un sistema di illuminazione che utilizza sia luce diretta (luce che proviene direttamente da una sorgente luminosa) sia luce indiretta (luce che rimbalza da una superficie). In un motore di rendering 3D, l'illuminazione globale è uno degli elementi più importanti per ottenere un'illuminazione realistica. L'illuminazione globale cerca di imitare come si comporta la luce nella vita reale, come la luce che rimbalza sulle superfici e la luce emessa dai materiali emissivi.

Nell'esempio seguente, l'intera scena è illuminata da un materiale emissivo (il quadrato bianco in alto). La parete e il soffitto bianchi in fondo sono tinti di rosso e verde vicino alle pareti, poiché la luce che rimbalza sulle pareti colorate è riflessa sul resto della scena.

../../../_images/global_illumination_example.webp

L'illuminazione globale è composta da diversi concetti fondamentali:

Illuminazione indiretta diffusa

Questa è l'illuminazione che non cambia a seconda dell'angolazione della telecamera. Esistono due fonti principali di illuminazione diffusa indiretta:

  • Luce che rimbalza sulle superfici. Questa luce riflessa è moltiplicata per il colore dell'albedo del materiale. La luce riflessa può quindi essere riflessa da altre superfici, con un impatto decrescente dovuto all'attenuazione della luce. Nella vita reale, la luce rimbalza un numero infinito di volte. Tuttavia, per motivi di prestazioni, non è possibile simularlo in un motore di gioco. Invece, il numero di rimbalzi è in genere limitato a 1 o 2 (o fino a 16 durante la preparazione delle lightmap). Un numero maggiore di rimbalzi porterà a un calo della luce più realistico nelle aree ombreggiate, a scapito di prestazioni inferiori o tempi di preparazione più lunghi.

  • Anche i materiali emissivi possono emettere luce che può essere riflessa sulle superfici. Ciò agisce come una forma di illuminazione ad area. Anziché avere un punto infinitamente piccolo che emette luce attraverso un nodo OmniLight3D o SpotLight3D, un'area di una determinata dimensione emetterà luce attraverso la propria superficie.

L'illuminazione diffusa diretta è già gestita dai nodi di luce stessi, il che significa che gli algoritmi di illuminazione globale cercano solo di rappresentare l'illuminazione indiretta.

Diverse tecniche di illuminazione globale offrono diversi livelli di accuratezza nel rappresentare l'illuminazione diffusa indiretta. Consultare la tabella comparativa in fondo a questa pagina per ulteriori informazioni.

Per fornire un'occlusione ambientale più accurata per piccoli oggetti, è possibile abilitare l'occlusione ambientale nello spazio dello schermo (SSAO) nelle impostazioni dell'ambiente. L'SSAO ha un impatto significativo sulle prestazioni, quindi è meglio disattivarlo quando si punta a hardware di fascia bassa.

Nota

L'illuminazione diffusa indiretta potrebbe causare color banding nelle scene senza texture dettagliate. Ciò significa che i gradienti di luce non saranno uniformi, ma presenteranno invece un evidente effetto "a gradini". Consultare la sezione Color banding nella documentazione sulle limitazioni del rendering 3D per informazioni su come ridurre questo effetto.

Illuminazione speculare

L'illuminazione speculare è anche detta riflessione. Questa è l'illuminazione che cambia intensità a seconda dell'angolazione della telecamera. Questa illuminazione speculare può essere diretta o indiretta.

La maggior parte delle tecniche di illuminazione globale offre un modo per renderizzare l'illuminazione speculare. Tuttavia, il grado di accuratezza con cui è renderizzata varia notevolmente da una tecnica all'altra. Per ulteriori informazioni, consultare la tabella comparativa in fondo a questa pagina.

Per ottenere riflessi più accurati per oggetti piccoli, è possibile abilitare i riflessi nello spazio dello schermo (SSR) nelle impostazioni dell'ambiente. SSR ha un impatto significativo sulle prestazioni (anche maggiore di SSAO), quindi assicurati di disattivarli quando punti a hardware di fascia bassa.

Quale tecnica di illuminazione globale dovrei utilizzare?

Quando si sceglie una tecnica di illuminazione globale (GI) da utilizzare, ci sono diversi criteri da tenere a mente:

  • Prestazioni. Le tecniche di GI in tempo reale sono solitamente più costose rispetto alle tecniche semi-tempo-reale o pre-calcolate. Nota che la maggiorità dell'impatto sulle prestazioni per la GI è sulla GPU, piuttosto che sulla CPU.

  • Elementi visivi. Oltre a non offrire le massime prestazioni, le tecniche di GI in tempo reale generalmente non forniscono il miglior risultato visivo. Ciò si nota soprattutto in una scena perlopiù statica, dove la natura dinamica della GI in tempo reale non è facilmente percepibile. Se l'obiettivo è massimizzare la qualità visiva, le tecniche di precalcolo spesso avranno un aspetto migliore e ridurranno le perdite di luce.

  • Capacità in tempo reale. Alcune tecniche di GI sono completamente in tempo reale, mentre altre sono solo semi-tempo-reale o non lo sono affatto. Le tecniche semi-tempo-reale hanno limitazioni che le tecniche completamente in tempo reale non hanno. Ad esempio, gli oggetti dinamici potrebbero non contribuire all'illuminazione emissiva della scena. Le tecniche non in tempo reale non supportano alcuna forma di GI dinamica, quindi deve essere simulata attraverso altre tecniche, se necessario (come posizionando luci vicino alle superfici emissive). La capacità in tempo reale influisce anche sulla praticabilità della tecnica di GI nei livelli generati proceduralmente.

  • Richiede impegno dall'utente. Alcune tecniche di GI sono completamente automatiche, mentre altre richiedono un'attenta pianificazione e un lavoro manuale da parte dell'utente. A seconda del tempo a disposizione, alcune tecniche di GI potrebbero essere preferibili ad altre.

Ecco un confronto tra tutte le tecniche di illuminazione globale disponibili in Godot:

Prestazioni

In ordine di prestazioni dalla più veloce alla più lenta:

  • ReflectionProbe:

    • Le ReflectionProbe con la modalità di aggiornamento impostata su Sempre sono molto più costose delle sonde con la modalità di aggiornamento impostata su Una volta (predefinito). Adatte per la grafica integrata quando si utilizza la modalità di aggiornamento Una volta. Disponibili in tutti i renderer.

  • LightmapGI:

    • Le luci si possono precalcolare solo con l'illuminazione indiretta, oppure a precalcolare completamente per ogni singola luce per migliorare ulteriormente le prestazioni. È possibile utilizzare configurazioni ibride (ad esempio, avendo una luce direzionale in tempo reale e luci posizionali completamente precalcolate). Le informazioni direzionali si possono abilitare prima del precalcolo per migliorare le visuali con un piccolo impatto sulle prestazioni (e a scapito di file di dimensioni maggiori). Adatto per grafica integrata. Disponibile in tutti i renderer. Tuttavia, il precalcolo delle lightmap richiede hardware con supporto di RenderingDevice.

  • VoxelGI:

    • Il numero di suddivisioni del precalcolo si può regolare per bilanciare prestazioni e qualità. La qualità del rendering VoxelGI si può regolare nelle Impostazioni del progetto. Il rendering si può eseguire facoltativamente a metà risoluzione (e poi ridimensionato linearmente) per migliorare le prestazioni significativamente. Non disponibile quando si utilizzano i renderer Mobile o Compatibilità.

  • Illuminazione indiretta nello spazio dello schermo (SSIL):

    • La qualità e il numero di passaggi di sfocatura del SSIL si possono regolare nelle Impostazioni del progetto. Come predefinito, il rendering SSIL è eseguito a metà risoluzione (e poi ridimensionato linearmente) per garantire un livello di prestazioni ragionevole. Non disponibile quando si utilizzano i renderer Mobile o Compatibilità.

  • SDFGI:

    • Il numero di cascate si può regolare per bilanciare prestazioni e qualità. Il numero di raggi proiettati per frame si può regolare nelle Impostazioni del progetto. Il rendering si può eseguire facoltativamente a metà risoluzione (e poi ridimensionato linearmente) per migliorare le prestazioni significativamente. Non disponibile quando si utilizzano i renderer Mobile o Compatibilità.

Visuali

Per un confronto, ecco una scena 3D senza l'uso di opzioni di illuminazione globale:

Una scena 3D senza alcuna forma di illuminazione globale (solo illuminazione ambientale costante). La scatola e la sfera vicino alla telecamera sono entrambi oggetti dinamici.

Una scena 3D senza alcuna forma di illuminazione globale (solo illuminazione ambientale costante). La scatola e la sfera vicino alla telecamera sono entrambi oggetti dinamici.

Ecco un confronto tra le varie tecniche di illuminazione globale di Godot:

  • VoxelGI: average Buoni riflessi e illuminazione indiretta, ma attenzione alle perdite.

    • A causa della sua natura basata sui voxel, VoxelGI mostrerà perdite di luce se pareti e pavimenti sono troppo sottili. Si raccomanda di assicurarsi che tutte le superfici solide abbiano uno spessore almeno pari a un voxel.

      Si potrebbero anche notare artefatti di striatura su superfici inclinate. In questo caso, regolare le proprietà di bias o ruotare il nodo VoxelGI può aiutare a mitigarli.

      VoxelGI in azione.

      VoxelGI in azione.

  • SDFGI: average Buoni riflessi e illuminazione indiretta, ma attenzione alle perdite e ai cambiamenti a cascata percettibili.

    • Il livello di dettaglio della GI varia a seconda della distanza tra la telecamera e la superficie.

      È possibile ridurre le perdite notevolmente abilitando la proprietà Use Occlusion. Questa opzione ha un piccolo impatto sulle prestazioni, ma spesso risulta in un minor numero di perdite rispetto a VoxelGI.

      Si possono notare cambiamenti a cascata quando la telecamera si muove velocemente. Ciò si può rendere meno evidente regolando le dimensioni della cascata o utilizzando la nebbia.

      SDFGI in azione.

      SDFGI in azione.

  • Illuminazione indiretta nello spazio dello schermo (SSIL): average Buona sorgente secondaria di illuminazione indiretta, ma senza riflessi.

    • SSIL è progettato per essere utilizzato come complemento ad altre tecniche di GI come VoxelGI, SDFGI o LightmapGI. SSIL funziona al meglio per dettagli su piccola scala, poiché non è in grado di fornire da solo un'illuminazione indiretta accurata per grandi strutture. SSIL può fornire un'illuminazione indiretta in tempo reale in situazioni in cui altre tecniche di GI non riescono a catturare dettagli su piccola scala o oggetti dinamici. La sua natura spazio schermo può causare alcuni artefatti, soprattutto quando gli oggetti entrano ed escono dallo schermo. SSIL funziona utilizzando il colore dell'ultimo frame (prima della post-elaborazione), il che significa che le decalcomanie emissive e gli shader personalizzati sono inclusi (purché presenti sullo schermo).

      SSIL in azione (senza altre tecniche GI). Notare l'illuminazione emissiva attorno alla scatola gialla.

      SSIL in azione (senza altre tecniche GI). Notare l'illuminazione emissiva attorno alla scatola gialla.

  • LightmapGI: good Ottima illuminazione indiretta, riflessi decenti (facoltativi).

    • Questa è l'unica tecnica in cui il numero di rimbalzi di luce si può aumentare oltre 2 (fino a 16). Quando le informazioni direzionali sono abilitate, le armoniche sferiche (SH) sono utilizzate per produrre riflessi sfocati.

      LightmapGI in azione. Qui è precalcolata solo la luce indiretta, ma è possibile precalcolare anche la luce diretta.

      LightmapGI in azione. Qui è precalcolata solo la luce indiretta, ma è possibile precalcolare anche la luce diretta.

  • ReflectionProbe: average Buoni riflessi, ma scarsa illuminazione indiretta.

    • L'illuminazione indiretta può essere disattivata, impostata su un colore costante distribuito su tutta la sonda o letta automaticamente dall'ambiente della sonda (e applicata come cubemap). In pratica, agisce come illuminazione ambientale locale. I riflessi e l'illuminazione indiretta vengono combinati con quelli delle altre sonde vicine.

      ReflectionProbe in azione (senza altre tecniche di GI). Notare la sfera riflettente.

      ReflectionProbe in azione (senza altre tecniche di GI). Notare la sfera riflettente.

Capacità in tempo reale

  • VoxelGI: good Completamente in tempo reale.

    • L'illuminazione indiretta e i riflessi sono completamente in tempo reale. Gli oggetti dinamici possono ricevere l'illuminazione globale e contribuirvi con le loro superfici emissive. Anche gli shader personalizzati possono emettere luce propria, che sarà emessa accuratamente.

      Valida per livelli generati proceduralmente se generati in anticipo (e non durante il gioco). Il precalcolo richiede diversi secondi o più, ma è possibile eseguirlo sia dall'editor sia da un progetto esportato.

  • SDFGI: average In semi tempo reale.

    • Le cascate sono generate in tempo reale, rendendo il SDFGI ideale per livelli generati proceduralmente (anche quando le strutture sono generate durante il gioco).

      Gli oggetti dinamici possono ricevere la GI, ma non contribuirvi. L'illuminazione emissiva viene aggiornata solo quando un oggetto entra in una cascata, quindi potrebbe comunque funzionare per oggetti che si muovono lentamente.

  • Illuminazione indiretta nello spazio dello schermo (SSIL): good Completamente in tempo reale.

    • SSIL funziona sia con luci statiche sia dinamiche. Funziona anche con occlusori statici e dinamici (inclusi i materiali emissivi).

  • LightmapGI: bad Precalcolato, perciò non in tempo reale.

    • Sia l'illuminazione indiretta sia i riflessi di SH sono precalcolati e non si possono modificare in fase di esecuzione. L'illuminazione globale in tempo reale deve essere simulata tramite altri mezzi, come le luci posizionali in tempo reale. Gli oggetti dinamici ricevono l'illuminazione indiretta tramite sonde luminose, che è possibile posizionare automaticamente o manualmente dall'utente (nodo LightmapProbe). Non è fattibile per i livelli generati proceduralmente, poiché la preparazione delle lightmap è possibile solo dall'editor.

  • ReflectionProbe: average Opzionalmente in tempo reale.

    • Normalmente, le riflessioni si aggiornano quando la sonda viene spostata. Si aggiornano il più spesso possibile se la modalità di aggiornamento è impostata su Always (che è costosa).

    • L'illuminazione indiretta deve essere configurata manualmente dall'utente, ma si può modificare in fase di esecuzione senza dover ricorrere a un calcolo costoso dietro le quinte. Ciò rende i ReflectionProbe adatti per i livelli generati proceduralmente.

Necessita di lavoro dall'utente

  • VoxelGI: È necessario creare e precalcolare uno o più nodi VoxelGI.

    • Per ottenere buoni risultati è necessario regolare adeguatamente le estensioni. Inoltre, ruotare il nodo e ripetere il precalcolo può aiutare a contrastare perdite o artefatti di striature in certe situazioni. I tempi di precalcolo sono rapidi, solitamente inferiori a 10 secondi per una scena di media complessità.

  • SDFGI: Molto poco.

    • SDFGI è completamente automatico; è necessario solo abilitarlo nella risorsa Environment. L'unica operazione manuale richiesta è impostare adeguatamente la proprietà Bake Mode delle MeshInstance. Non è necessario creare alcun nodo e non è richiesto alcun precalcolo.

  • Illuminazione indiretta sullo spazio dello schermo (SSIL): Molto poco.

    • SSIL è completamente automatica; è necessario solo abilitarlo nella risorsa Environment . Non è necessario creare alcun nodo e non è richiesto alcun precalcolo.

  • LightmapGI: Necessita di una configurazione UV2 e di un precalcolo.

    • È necessario reimportare le mesh statiche con UV2 e generazione di lightmap abilitati. Su una GPU dedicata, i tempi di preparazione sono relativamente rapidi grazie all'elaborazione sulla GPU: solitamente inferiori a 1 minuto per una scena di media complessità.

  • ReflectionProbe: Posizionato manualmente dall'utente.

Riepilogo

In caso di dubbi su quale tecnica di GI utilizzare:

  • Per i giochi desktop, è una buona idea cominciare con SDFGI, poiché richiede la minima configurazione. Passare ad altre tecniche di GI in seguito, se necessario. Per migliorare le prestazioni sulle GPU di fascia bassa e schede grafiche integrate, si consiglia di aggiungere un'opzione per disabilitare SDFGI o VoxelGI nelle impostazioni del gioco. Il SDFGI può essere disabilitato nella risorsa Environment , mentre il VoxelGI può essere disabilitato nascondendo i nodi VoxelGI. Per migliorare ulteriormente la grafica su GPU di fascia alta, aggiungere un'opzione per abilitare il SSIL nelle impostazioni del gioco.

  • Per i giochi su dispositivi mobili, LightmapGI e ReflectionProbes sono le uniche opzioni supportate. Vedere anche Alternative alle tecniche di GI.

Vedi anche

È possibile confrontare le tecniche di illuminazione globale in azione attraverso il progetto dimostrativo Global Illumination.

Quale modalità di illuminazione globale si dovrebbe usare su mesh e luci?

A prescindere dalla tecnica di illuminazione globale utilizzata, non esiste una modalità assolutamente "migliore". Tuttavia, ecco alcuni consigli per le mesh:

  • Per la geometria statica di un livello, utilizzare la modalità di illuminazione globale Static (predefinita).

  • Per piccole geometrie dinamiche e giocatori/nemici, utilizzare la modalità di illuminazione globale Disabled. Le piccole geometrie dinamiche non saranno in grado di fornire una notevole quantità di illuminazione indiretta, poiché la geometria è più piccola di un voxel. Se è necessaria un'illuminazione indiretta per piccoli oggetti dinamici, è possibile simularla tramite nodi OmniLight3D o SpotLight3D come figli degli oggetti.

  • Per grandi geometrie dinamiche di un livello (come un treno in movimento), utilizzare la modalità di illuminazione globale Dynamic. Si noti che questa ha effetto solo con VoxelGI, in quanto il SDFGI e il LightmapGI non supportano l'illuminazione globale con gli oggetti dinamici.

Ecco alcuni consigli per le modalità di precalcolo della luce:

  • Per l'illuminazione statica di un livello, utilizzare la modalità di precalcolo Static. La modalità Static è adatta anche per luci dinamiche che non cambiano molto durante il gioco, come una torcia tremolante.

  • Per effetti dinamici di breve durata (ad esempio un'arma), utilizzare la modalità di precalcolo Disabled per migliorare le prestazioni.

  • Per effetti dinamici di lunga durata (come una luce di allarme rotante), utilizzare la modalità di precalcolo Dynamic per migliorare la qualità (predefinita). Si noti che questa modalità ha effetto solo con il VoxelGI e il SDFGI, poiché il LightmapGI non supporta l'illuminazione globale con luci dinamiche.

Alternative alle tecniche di GI

Se nessuna delle tecniche di IG menzionate sopra è adatta, è comunque possibile simulare l'illuminazione globale posizionando manualmente luci aggiuntive. Questo richiede più lavoro manuale, ma può offrire buone prestazioni e una buona resa visiva se fatto correttamente. Questo approccio è ancora utilizzato in molti giochi moderni.

Quando si punta a hardware di fascia bassa in situazioni in cui usare LightmapGI non è fattibile (come per i livelli generati proceduralmente), potrebbe essere necessario affidarsi esclusivamente all'illuminazione ambientale o a un fattore di luce ambientale costante. Ciò porta a un aspetto visivo più piatto ma, regolando il colore della luce ambientale e del contributo del cielo, è comunque possibile ottenere risultati accettabili nella maggior parte dei casi.