In questa lezione vediamo la tecnica delle Light Probe, un metodo per avere una Global Illumination sugli oggetti in movimento. A seguire, alcune opzioni extra del Lightmapping.
Le Light Probe
Visto che le lightmap sono utili solo per oggetti che non si muovono, serve una tecnica per approssimare la global illumination per oggetti in movimento. Le light probe assolvono a questo compito: non contengono tutte le informazioni di luce (e soprattutto di ombre) delle lightmap, ma sono meno esose rispetto al calcolare la luce su un oggetto in realtime.
Le probe sono, come dice il nome, dei campionamenti della luce in alcuni punti della scena. Appaiono in scena come una sfera, sulla cui superficie viene salvata la luce che proviene dalle parti circostanti. Gli oggetti che fanno uso di light probe usano queste sfere per calcolare il loro colore, invece di leggerlo dalle luci stesse. Quando si trovano in mezzo a due o più sfere, viene fatta una media fra le sfere intorno all'oggetto stesso.
Ad esempio, in questa scena abbiamo 3 luci Point colorate ed una Directional bianca in alto, tutte con ombre (quindi è necessario usare il Deferred Rendering per avere le ombre). Come geometrie, è presente una serie di parallelepipedi ed un piano tutti statici, e per questi basta usare le lightmap.
Abbiamo poi una capsula che è mobile, quindi la lightmap non va bene. Se lasciamo che la capsula sia illuminata in realtime, si vedrà così:
Usando le light probes, possiamo ottenere un effetto simile:
Come si può notare, la capsula risulta meglio integrata nel contesto e riproduce più fedelmente la situazione complessa di luce di questa scena.
Per utilizzare le light probes, serve un “oggetto contenitore”, ovvero un GameObject vuoto. Andiamo su GameObject > Create Empty
, il posizionamento di questo non è importante, ma conviene metterlo al centro della scena per praticità. Successivamente, aggiungiamo un componente di nome Light Probe Group. Viene creato il componente, ma ancora non ci sono probe in scena.
Cliccando su Add Probe
viene aggiunta una nuova probe, che in scena appare come una sfera gialla, che possiamo spostare mediante il gizmo traslazione - come un normale GameObject. Si può anche fare click per selezionarla, o premere F
per centrare la vista su di essa.
Continuando con Add Probe possiamo aggiungere le altre probe necessarie a sondare l'illuminazione della scena. Per decidere dove piazzare le probe, bisogna seguire due regole. La prima è che le probe creano delle strutture piramidali, che dividono lo spazio in tante piramidi. A partire da queste poi Unity farà l'interpolazione, usando la posizione dell'oggetto per decidere in quale piramide questo si trovi. Ad esempio nel nostro caso:
Queste probe formano una piramide, una vicino ad ogni luce colorata, ed una in alto. La probe in alto non fa il sampling di nessuna condizione di luce in particolare, ma è utile per creare la struttura a piramide.
Una volta sistemate le probe, possiamo andare nel pannello Lightmapping, e premere il tasto Bake Probes (è lo stesso del tasto Bake Scene, si trova premendo sul triangolino). Il processo è molto rapido, e produce un nuovo asset nella cartella della scena di tipo .asset:
Questo viene automaticamente assegnato come probe della scena. Come ultima operazione, dobbiamo fare in modo che la capsula utilizzi le probe. Per fare ciò, la selezioniamo e nell'Inspector del suo Mesh Renderer spuntiamo l'opzione Use Light Probes.
Come si può vedere sotto, la capsula si trova principalmente vicino alle probe della luce rossa e di quella verde, e perciò prende l'illuminazione da queste due facendo una media:
Anche muovendo la capsula ci accorgeremo che l'illuminazione - pur essendo di qualità quasi da Global Illumination - viene aggirnata in tempo reale e cambia a seconda della posizione della capsula.
Il pannellino Object e le opzioni per oggetto
Proseguendo il discorso delle lightmap intrapreso nella lezione prima, vediamo qualche altra opzione utile.
Nel sotto-pannello Object incluso nel pannello Lightmapping è possibile regolare le opzioni di baking per i singoli oggetti. Il pannello presenta un filtro: selezionando ad esempio Renderers, potremo vedere nella Hierarchy tutti gli oggetti che verranno forniti di una lightmap. Se qualcuno di questi non è Lightmap Static, possiamo modificarlo rapidamente da qui.
Quando viene fatto il baking, non viene creata una lightmap per ogni singolo oggetto, ma più oggetti vengono raggruppati sulla stessa texture con una tecnica che si chiama atlasing.
I valori di Scale in Lightmap ed Atlas controllano come Unity posiziona le coordinate UV dei singoli oggetti sulle lightmap: ad esempio se vogliamo che un oggetto abbia meno spazio sulla lightmap (perché non viene mai visto da vicino, o ci interessa meno di come si vedono le ombre su di esso) possiamo ridurre Scale a 0.5 o meno. Così facendo, Unity userà la metà dello spazio sulla lightmap per quel dato oggetto. Stesso discorso al contrario, aumentando il numero aumenterà lo spazio, ma solo fino ad un limite: se andiamo oltre, comparirà un messaggio che dice “Object's size in lightmap has reached the max atlas size.”, ovvero che Unity sta usando un'intera lightmap solo per questo oggetto, e che non possiamo farlo più grande.
I parametri di Atlas invece vengono impostati da Unity, e determinano su quale lightmap si trova un oggetto, e come è posizionato su di essa. Ad esempio:
In questo caso, l'oggetto si trova sulla prima lightmap (quella con index 0), occupa un quadrato il cui lato è grande lo 0.07
della lightmap (i valori di Tiling), ed è posizionato circa a 0.2
sulla X ed a -0.0
sulla Y.
Questi valori di solito non vanno modificati manualmente. L'unico caso potrebbe essere quello in cui la lightmap venga creata manualmente al di fuori di Unity, e si voglia far combaciare le UV con la sezione di lightmap creata, ma in questo caso bisognerà probabilmente disabilitare Generate Lightmap UVs nell'importazione del modello e fare l'unwrapping del secondo set di coordinate a mano nel proprio package 3D.
Per le luci invece, questo sotto-pannello presenta un paio di opzioni che sono legate all'Inspector della luce stessa (ovvero Lightmapping, il colore e l'intensità), ed alcuni valori che controllano la qualità delle ombre. Da notare che le ombre baked sono sempre morbide, solo quelle realtime possono essere Hard. Quindi un valore On (Realtime: Hard Shadow) vuol dire che la luce avrà ombre dure solo quando diventa realtime, come nel caso di luci vicine alla camera nelle Dual Lightmaps.
Il pannellino Maps
Il terzo sotto-pannellino di Lightmapping, Maps, permette di revisionare le lightmap create. Array Size determina il numero di lightmap (di nuovo, è un parametro che non va toccato a meno che non si stiano creando le lightmap al di fuori di Unity).
Il valore di Compressed permette di decidere se le lightmap sono Compressed, o Truecolor. In alternativa, si può cliccare su una delle texture in basso per localizzarla all'interno del progetto, ed impostarne la compressione a mano. Come sempre, texture più compresse sono più leggere ma possono presentare artefatti anche molto visibili. Con questo metodo si potrebbe anche impostare le dimensioni della texture: portando le lightmap da 1024 a 512 di lato, ognuna diventa un quarto di quanto era prima… a quel punto, si potrebbe valutare l'idea di usarle non compresse per una migliore resa visiva.
In questo pannellino troviamo anche, in alto, le light probes: nella prima casella è infatti linkato l'asset delle light probe prodotto a seguito del bake delle probe, e possiamo scollegarlo (selezionandolo e premendo Delete) o sostituirne un altro.