Illuminazione per i giochi mobile con Unity

L'illuminazione è uno degli aspetti più importanti di un gioco. Può creare l'atmosfera, guidare il giocatore, identificare minacce o obiettivi e altro ancora. L'illuminazione può creare o rompere la grafica di un gioco. Ad esempio, una buona illuminazione può migliorare l'aspetto di un modello scadente durante il gioco, mentre una scarsa illuminazione può peggiorare un ottimo modello.

Questa guida fornisce informazioni su come migliorare le prestazioni dell'illuminazione in un gioco per dispositivi mobili. Il modo in cui decidi di usare l'illuminazione influisce sulle prestazioni del tuo gioco per dispositivi mobili. È importante usare l'illuminazione in modo efficiente per garantire che il gioco si svolga nel modo più fluido possibile.

Alcune parti di questo articolo si basano sull'opera realizzata e protetta da copyright di Arm Limited.

Opzioni di rendering della pipeline

La pipeline di rendering legacy di Unity include i seguenti percorsi di rendering:

  • Rendering in avanti
  • Ombreggiatura differita

Rendering in avanti

Con il rendering avanzato, le luci in tempo reale sono molto costose. Se riduci il numero di luci presenti per pixel, puoi compensare questo costo.

Ombreggiatura differita

L'ombreggiatura differita richiede il supporto della GPU. Su hardware compatibile, l'ombreggiatura differita può eseguire il rendering di un gran numero di luci in tempo reale con un'elevata fedeltà dell'illuminazione. Sfortunatamente, l'ombreggiatura differita non funziona bene sulle GPU mobile perché hanno una larghezza di banda inferiore.

Quando crei un titolo per dispositivi mobili, è importante che il gioco funzioni senza problemi sul maggior numero possibile di dispositivi.

Pipeline di rendering universale

Unity ha sviluppato la Universal Render Pipeline (URP). Ti consigliamo vivamente di utilizzare URP per i tuoi giochi mobile.

Modalità Luce

Vengono utilizzate diverse modalità luce in base al modo in cui una luce si muove o viene utilizzata in una scena. I tipi di modalità Luce hanno caratteristiche di prestazioni diverse. Quando implementi le spie, considera quanto segue:

  • Utilizza baked per un'illuminazione statica. È la scelta ideale per gli oggetti che non cambiano la luminosità in fase di runtime. Le luci di cottura sono il processo di pre-computing e archiviazione dei dati dell'illuminazione in mappe delle texture note come mappe luminose.
    • Non è possibile modificare l'illuminazione soffusa in fase di esecuzione. Le luci e le ombre nelle mappe luci sono statiche. Dal momento che tutta l'illuminazione è stata pre-elaborata in Unity, non ci sono calcoli dell'illuminazione di runtime che incidono sulle prestazioni.
    • Non è possibile creare ombre dinamiche con una luce soffusa. Potrebbe sembrare strano con oggetti dinamici o in movimento.
  • Utilizza miste per luci fisse con cui intendi interagire con oggetti in movimento. Ad esempio, una torcia che proietta luce su un giocatore e genera un'ombra mentre il giocatore si muove.
    • Un'illuminazione mista crea luci e ombre dirette dinamiche.
    • Puoi includere un'illuminazione mista nei calcoli delle mappe luminose per gli oggetti statici.
    • Puoi modificare l'intensità al momento dell'attivazione. Viene aggiornata solo la luce diretta.
    • Costoso.
  • Usa le luci in tempo reale per le luci dinamiche o mobili, ad esempio quella proiettata da una palla di fuoco che si solleva da terra ed esplode.
    • Le proprietà di luci e ombre dinamiche possono essere modificate in fase di runtime.
    • Le luci in tempo reale non vengono inserite nelle mappe luminose.
    • Molto costoso.

Per maggiori informazioni, consulta la pagina La pipeline di illuminazione di Unity.

Se possibile, utilizza una luce statica ed evita quella dinamica

L'illuminazione dinamica o in tempo reale viene calcolata e aggiornata a ogni fotogramma. Questa funzionalità è perfetta per gli oggetti in movimento, per l'interattività e per creare emozioni.

Al contrario, le informazioni sulla luce statica vengono integrate nelle mappe luminose. L'utilizzo della texture lightmap consente a un oggetto di evitare costosi calcoli dell'illuminazione per vertice o per pixel. Il costo di rendering di una texture a mappa chiara è sempre più economico dell'illuminazione dinamica. Per l'implementazione in un gioco mobile, ti consigliamo di usare l'illuminazione soffusa come prima scelta.

Cucinare con mappa luminosa

Il precalcolo degli effetti della luce è noto come cottura su mappa luminosa. L'effetto della luce viene memorizzato in una trama separata, chiamata mappa luminosa. La mappa luminosa può essere utilizzata per migliorare l'aspetto degli oggetti. La preparazione della mappa luminosa deve essere eseguita una sola volta per ogni iterazione della scena. Se cambi la geometria della scena o cambi i parametri delle luci soffuse, dovrai rifare le mappe luminose. Fatta eccezione per l'overhead della texture Lightmap, non sono previsti costi aggiuntivi per le prestazioni in fase di runtime. Questo è il miglior approccio iniziale all'illuminazione su una piattaforma mobile.

La luce soffusa non è influenzata da aspetti dinamici o in movimento della scena. Per tutti gli elementi statici, invece, l'illuminazione soffusa prevede l'illuminazione globale a forno. Ciò significa che i calcoli delle mappe luminose includono la luce indiretta che ha rimbalzato su altri oggetti statici e le luci soffuse che colpiscono direttamente l'oggetto.

Figura 1. L'impianto di illuminazione completo utilizzato nella demo tecnologica di Armies.

Per cuocere le luci, svolgi i tre passaggi seguenti.

Passaggio 1: imposta le luci su Misto o Cotto

Imposta la Modalità delle luci su Misto o Cotto. Per i titoli per dispositivi mobili, l'ideale è usare Luci al forno piuttosto che Misto. Baked è il modo meno costoso per eseguire il rendering della luce.

Figura 2. L'impostazione Modalità della luce in Unity.

Passaggio 2: Rendi gli oggetti statici

Imposta gli oggetti interessati dalle luci da forno statici. Esistono molte ottimizzazioni per un oggetto contrassegnato come statico, ma di solito è preferibile selezionare Tutto nell'elenco a discesa Statico. Quando l'oggetto è contrassegnato come Statico, Unity sa di includerlo nella cottura leggera.

Figura 3. Un menu statico di esempio.

Passaggio 3: Cucinare le luci

Puoi cuocere le luci con il menu Illuminazione che si trova in Finestra > Rendering > Impostazioni illuminazione.

Quando cucini le luci, i dati salvati si basano su qualsiasi scena era attiva quando hai avviato la cottura. Viene generata una cartella con lo stesso nome della scena creata. In questa cartella sono archiviati tutti i componenti per i dati sull'illuminazione. Se il tuo progetto carica più scene contemporaneamente, devi attivare le luci per ciascuna scena. Se regoli la scena, devi riaccendere le luci.

Figura 4. Esempio di mappe luminose cotte.

Ottimizza mappe luminose

Dopo aver configurato le luci per essere cotte, assicurati che le mappe create siano ottimizzate. Le dimensioni delle mappe luminose variano in base alle impostazioni una volta cotte. È necessario mantenere basso l'utilizzo della memoria sui dispositivi mobili, pertanto le dimensioni della mappa luminosa devono essere monitorate.

Nell'esempio seguente tratto dalla demo di Armies sono presenti sette mappe luminose da 1024 x 1024 pixel. Nell'anteprima della mappa, puoi vedere le mesh posizionate sulla mappa luminosa. I mesh selezionati sono evidenziati.

Figura 5. Questo è un esempio di mappa luminosa. Le sezioni blu sono meshe selezionate.

Nelle impostazioni di Lightmapping sono disponibili molte impostazioni, oltre alle dimensioni delle mappe, che determinano la quantità di memoria e spazio di archiviazione utilizzata da ogni mappa. Nelle sezioni che seguono vengono messe in evidenza alcune impostazioni importanti.

Mappatori luminosi

Unity offre i seguenti tre metodi per l'accensione delle luci di una scena:

  • Enlighten (Illumina): questa funzionalità è supportata soltanto fino alla release di assistenza a lungo termine (LTS) del 2020. Non utilizzarlo per nuovi progetti.
  • CPU progressiva: consente di risparmiare molto tempo perché crea in modo incrementale mappe leggere. Se è selezionata l'opzione Assegna priorità alla visualizzazione, le aree nella visualizzazione della scena hanno la priorità. Questo può ridurre il tempo di iterazione necessario per configurare la luce della scena.
  • GPU progressiva: funziona come la CPU progressiva, ma genera la mappa luminosa sulla GPU anziché sulla CPU. Su hardware supportato, questo metodo può ridurre notevolmente i tempi di preparazione rispetto all'uso della CPU. Sono necessari ulteriori requisiti per la configurazione della GPU progressiva. Scopri di più sui requisiti nella pagina The Progressive GPU Lightmapper.

Figura 6. Le Impostazioni Lightmapper ti consentono di cambiare il metodo di cottura della scena.

Texel

Un texel, o pixel di texture, è un singolo pixel in una mappa di texture. I texel memorizzano le informazioni sulla luce in una mappa luminosa per ogni punto luminoso che colpisce un oggetto. Il maggior numero di texel utilizzati per unità di spazio influenza la qualità dell'illuminazione, il tempo di calcolo per il bake, i costi di archiviazione su disco e il costo della VRAM delle tue mappe luminose.

Per ridurre la quantità di dati richiesti della mappa luminosa, regola il numero di texel per unità di cottura nelle impostazioni di mappatura luminosa.

Figura 7. Impostazioni disponibili per le mappe luminose.

Nelle impostazioni di mappatura luci, il parametro Risoluzione mappa luminosa controlla quanti texel vengono utilizzati per unità nella mappa luminosa. Di seguito è riportato un esempio di cubo con impostazioni di Risoluzione mappa luminosa diverse. Puoi vedere come una risoluzione maggiore aumenta rapidamente la quantità di lavoro necessaria.

Figura 8. Il primo cubo ha una Risoluzione mappa luminosa di 1. Il secondo cubo ha una Risoluzione mappa luminosa di 2. Il terzo cubo ha una risoluzione della mappa luminosa di 5.

Per vedere come sono disposti i tex nella scena, seleziona l'elenco a discesa Modalità disegno nella visualizzazione scena e scegli Mappa luminosa a fuoco.

Gli oggetti cotti sono coperti da un overlay a scacchiera. Lo schema a scacchiera mostra come sono distribuiti i texel quando cucini le luci.

Nell'esempio seguente, una riduzione della Risoluzione mappa luminosa da 15 a 12 nella demo dell'esercito riduce il numero di mappe luminose necessarie da sette a quattro.

Figura 9. Demo di The Armies con una risoluzione della mappa luminosa di 12.

Utilizzo di Texel

Sebbene sia possibile impostare il numero di texel per unità in un'intera scena, spesso ci sono alcuni oggetti che non hanno bisogno di così tanti texl.

Unity ti consente di controllare il numero di texel utilizzato da ciascun oggetto. In Ispezionatore > Renderer mesh per un oggetto, il valore del parametro Scale in Lightmap controlla il numero di texel utilizzati dall'oggetto nella mappa luminosa.

Nell'esempio seguente, il cubo a sinistra ha cinque gradini di informazioni chiare per unità di cottura. Il riquadro Scale in Lightmap della casella a destra è impostato su 0,5. Questa impostazione scala i texl di luce a 2,5, il che richiede meno spazio nella mappa luminosa rispetto al riquadro a sinistra.

Figura 10. Due cubi con diverse risoluzioni della mappa luminosa.

Figura 11. Puoi modificare l'impostazione Scale in Lightmap in modo che un oggetto abbia meno texel.

Cerca di evitare di spendere punti quanto segue:

  • Superfici e oggetti non visibili al player. In questo modo si evita lo spreco di memoria sulle mappe luminose per i dettagli che non sono sullo schermo.
  • Superfici con variazioni di luce minime. Ad esempio, oggetti in ombra o toccati da una singola sorgente luminosa.
  • Oggetti piccoli o sottili. La quantità di illuminazione ricevuta da questi elementi non aggiungerà molto al rendering finale della scena.

Falsa il più possibile l'illuminazione

Per ridurre i requisiti di elaborazione, puoi falsificare alcuni elementi. In questo modo, i tuoi contenuti potrebbero sembrare leggeri, ma in realtà usano metodi più efficienti.

Ombre finte

Le ombre in tempo reale sono costose. Vengono generati con una tecnica chiamata mappatura delle ombre. Il costo per eseguire il rendering della geometria di una scena sulla mappa ombre è proporzionale al numero di vertici disegnati con le ombre attivate. Ti consigliamo di limitare la quantità di elementi geometrici che proiettano ombre e il numero di luci che proiettano ombre in tempo reale.

Puoi implementare ombre finte per le ombre sugli oggetti dinamici senza luci dinamiche. Questo consente di mantenere bassi i costi di rendering e può ottenere un effetto simile alle ombre dinamiche. Di seguito sono riportati alcuni modi per implementare le ombre finte:

  • Utilizza una rete mesh 3D, ad esempio un piano o un riquadro, posizionata sotto il personaggio e applica una texture sfocata.
  • Puoi scrivere il tuo shadowr personalizzato per shadowing più sofisticate.

Nell'esempio seguente viene mostrato il risultato se utilizzi una mesh 3D per un'ombra:

Figura 12. Implementazione shadow nella demo tecnologica dell'esercito.

Colora le informazioni sulla luce direttamente sulle texture

Se dipingi parte dell'ombra nelle texture, riduci il calcolo necessario per le luci aggiuntive. Ciò consente di risparmiare memoria quando attivi le luci di Scene, poiché richiede meno dati della mappa luminosa.

Sonde luminose

Quando utilizzi oggetti dinamici con illuminazione soffusa, questi non saranno interessati dalle mappe luminose. Di conseguenza potrebbero sentirsi come se non facessero parte della scena.

Puoi risolvere questo problema con le sonde luminose. Le sonde luminose offrono vantaggi simili a quelli delle mappe luminose. Archiviano dati leggeri che possono essere calcolati in anticipo e salvati per l'uso in fase di runtime. In questo modo si spostano gran parte dei costi di calcolo necessari per la modifica del tempo.

Mentre una mappa luminosa codifica la luce ricevuta in un testo per le superfici, una sonda per la luce memorizza la luce che passa attraverso uno spazio vuoto. Questi dati possono essere utilizzati per luminare gli oggetti che si muovono. Le sonde luminose aiutano a integrare visivamente oggetti dinamici con oggetti con mappa luminosa all'interno della scena.

Le sonde luminose sono ideali per illuminare gli oggetti che si muovono nella scena. Le sonde sfruttano le luci cotte, in modo che gli oggetti in movimento abbiano la stessa luce della scena. L'illuminazione di oggetti dinamici con le sonde luminose è meno costosa delle luci in tempo reale.

Scopri di più sulle pagine Illuminazione statica con sonde per la luce e Sonde per la luce.

Figura 13. Sonde luminose posizionate per illuminare la folla dinamica nella demo tecnologica dell'esercito.

Impostazioni del renderer mesh

Indipendentemente dal tipo di luce utilizzata dalla scena, è importante che le impostazioni del rendering mesh siano corrette.

Disattiva tutto ciò che non utilizzi. Impostazioni come Cast ombre comportano costi aggiuntivi quando esegui il rendering della scena anche se l'oggetto non è illuminato. L'esempio seguente delle impostazioni del Renderer mesh riguarda un personaggio mostrato nella Figura 13. Il personaggio utilizza i dati delle sonde luminose, ma non delle sonde a riflessione.

L'impostazione Combina sonde per le sonde luminose unisce le informazioni luminose provenienti dalle sonde più vicine al personaggio. Mentre il personaggio si muove nella scena, le luci che interessano il personaggio cambiano. L'opzione Trasmetti ombre è disattivata perché il rendering utilizza il metodo blob. Anche l'opzione Ricevi ombre è disattivata perché la scena è completa e non ci sono ombre in tempo reale.

Figura 14. Impostazioni del Renderer mesh per il rendering di Figura 13.

Luci e tipi di luci in tempo reale

Ti consigliamo di utilizzare la tua illuminazione con illuminazione soffusa, sonda di luce e tecniche di finta illuminazione, come texture dipinte o effetti di materiali dello ombreggiatore. Tuttavia, se hai bisogno di una luce in tempo reale, devi considerare il tipo di luce da utilizzare.

Ogni tipo di luce ha un costo diverso per il calcolo dell'illuminazione. Il seguente elenco descrive in dettaglio ogni tipo di luce:

  • Direzionale: questa luce ha una direzione uniforme e non cade. La luce direzionale è la luce in tempo reale più economica. Spesso è necessaria una sola luce direzionale per scena. Con il rendering in avanti, il percorso di rendering suggerito per i dispositivi mobili, Unity includerà una luce direzionale predefinita se nella scena non sono presenti luci direzionali.
  • Spot: i faretti colpiscono gli oggetti all'esterno del cono e non li illumina. Ciò rende gli faretti meno costosi dal punto di vista computazionale rispetto alle luci puntuali sferiche. Per ottenere prestazioni ottimali, mantieni stretto il cono e colpisci solo gli oggetti previsti.
  • Punto: queste luci trasmettono la luce in tutte le direzioni. La diffusione della luce in tutte le direzioni è utile, ma molto costosa. Le luci puntiforme sono costose in un'ampia regione. Inoltre, il calcolo delle ombre può essere la parte più costosa dell'illuminazione. Se trasmetti la luce in tutte le direzioni, ci sono più ombre e più calcoli.