Fino a questo momento abbiamo lavorato solo con delle mesh nude e crude. Adesso è arrivato il momento di vestirle e di renderle qualcosa di più che un semplice ammasso di poligoni.
Che tu stia puntando a creare un videogioco iper realistico o con uno stile grafico più peculiare ed artistico, avrai sicuramente bisogno di materiali diversi per comporre la tua scena e renderla accattivante agli occhi del videogiocatore, non credi?
Del resto credo tu sappia che nel videogioco l’impatto grafico è fondamentale, quindi senza perdere altro tempo tuffiamoci nel fantastico (ma anche molto, molto complicato) mondo degli shaders, materiali e texture in Unity.
Le texture
Per la creazione di materiali saranno indispensabili delle texture. Cos’è una texture? Presto detto:una texture è un’immagine che viene applicata ad un oggetto tridimensionale per dargli una trama. Questa avvolgerà l’oggetto come la carta di un regalo di Natale, seguendo dei precisi riferimenti definiti in fase di modellazione dell’oggetto 3D.

Essendo una texture un’immagine, essa è la combinazione di tre canali diversi, ognuno dei quali gestisce un colore diverso. Avrai sicuramente sentito parlare dei famosissimi canali R G B (Red, Green, Blue, cioè rosso, verde e blu) che combinati fra loro danno vita ai vari colori che compongono la nostra immagine. Esiste inoltre un quarto canale, detto canale Alpha, che gestisce la trasparenza dell’immagine. Esso non è supportato da tutti i formati di immagine (ad esempio, il famosissimo JPEG non lo supporta!) ma è importantissimo per alcuni tipi di texture che vedremo fra poco. Quindi, in alcuni casi, sarà fondamentale lavorare con formati che lo supportano (come il PNG o il TIFF)!
Puoi importare una texture all’interno di Unity semplicemente trascinandola all’interno del Project Panel. Cliccando su di essa si aprirà un menù da cui potrai modificare alcune impostazioni. Ad esempio, potrai trasformare l’immagine in un cookie, che come abbiamo visto nella scorsa lezione è una maschera in grado di far proiettare una determinata ombra alla nostra luce. Un cookie è un’immagine che lascia passare la luce in base alla trasparenza del proprio canale alpha e puoi crearne uno con un qualsiasi editor di immagini.
Assicurati di creare un’immagine che abbia altezza e larghezza uguali (certe luci supportano solo immagini quadrate) e lavora in scala di grigi, tenendo presente che le parti più scure saranno quelle in cui l’ombra sarà più intensa. Dopo averla importata in Unity, impstala come cookie del tipo di luce a cui andrai ad applicarla e spunta la casella “alpha from grayscale“. Così potrai creare i cookie che preferisci!

Shaders e materiali
Adesso bisogna creare un nuovo materiale. Per farlo, basta cliccare col tasto destro sul project panel e selezionare l’opzione “Create>Material” dal menù a tendina.
Ovviamente bisogna creare un materiale differente per ogni tipo di oggetto di cui avrai bisogno! Un materiale per il legno, uno per il metallo, uno per la roccia e così via. Potrai applicare un materiale ad una mesh della scena semplicemente trascinandolo su di essa.

Dopo aver creato il tuo primo materiale potrai vedere, nel consueto Inspector Panel una miriade di parametri e settaggi che lo riguardano. Prima fra tutte il tipo di shader utilizzato per renderizzare il materiale (che di default sarà lo standard shader).
Ma cosa è esattamente uno shader?
La risposta completa è abbastanza complessa e non voglio confonderti troppo le idee, quindi per il momento possiamo definire uno shader come quella parte di codice responsabile del comportamento grafico di un materiale.
Questo, attraverso diversi algoritmi e calcoli matematici, può gestire come un determinato materiale debba reagire alla luce (se rifletterla o meno), creare un effetto particolare in prossimità dei vertici di una mesh, determinare se un materiale debba essere trasparente o meno, se il materiale in questione debba avere una sua texture o un suo colore e molto, molto altro! Insomma, lo shader è il codice che sta dietro al materiale e che ci permette di regolarne le varie impostazioni.
Unity mette a disposizione una tonnellata di shader differenti (e se non fossero abbastanza è possibile acquistarne dallo store o crearne di nuovi!)
Tuttavia in questa lezione ci soffermeremo unicamente sullo shader più utilizzato (e che da solo basta ad emulare buona parte dei materiali esistenti): lo standard shader!
Lo standard shader
Lo standard shader sostituisce una lunga serie di shader presenti nelle vecchie versioni di Unity (e che, per una questione di compatibilità con i vecchi progetti, puoi trovare ancora oggi all’interno della sezione “Legacy shaders”. Tuttavia ti sconsiglio di utilizzarli!) utilizzati per creare diversi materiali. Grazie allo standard shader potrai creare un materiale riflettente, opaco, trasparente o luminescente modificando opportunamente i parametri di questo unico, fantastico shader. Figo, no?
Lo standard shader possiede anche una variante: lo “standard shader (specular setup)“. Esistono pochissime differenze fra questi due shader (le vedremo fra pochissimo) e il più delle volte possono essere utilizzati entrambi per ottenere i medesimi risultati.
Che dire quindi? Vediamo come creare qualsiasi materiale ci passi per la testa!
- Albedo: Questo sarà il parametro che darà il colore al nostro materiale. Per farlo possiamo utilizzare la paletta dei colori (a destra) o aggiungere una Albedo map: una texture particolare che contiene solo informazioni riguardanti il colore di un oggetto!
A sinistra puoi vedere l’albedo map della texture di destra: i colori risultano più uniformi e le ombre più piatte, così da rendere la texture utilizzabile in scene diverse e sotto diverse condizioni di illuminazione! - Normal Map: Qualche lezione fa abbiamo parlato di normali ad una superficie, ricordi? Se di solito la normale ad un poligono è uguale in ogni suo punto, una normal map è una texture che altera la normale in ogni punto del poligono, cambiando così l’incidenza dei raggi di luce e dando una sensazione di profondità all’oggetto. La normal map è una di quelle texture che cambiano completamente l’impatto grafico di un materiale!
La normal map della nostra parete rocciosa in tuta la sua bellezza! Per far sì che la normal map sia efficace bisogna prima settarne la tipologia come “normal map”,come puoi vedere dall’immagine qui sotto
a questo punto basterà trascinarla all’interno del materiale come qualsiasi altra texture e il è fatto! Potrai modificarne l’efficacia tramite l’apposito valore sulla destra
- Height map: è una texture in scala di grigi che da all’oggetto diverse altezze in base alle diverse tonalità. I punti più scuri saranno più bassi, mentre i punti più chiari saranno più alti!
Una height map in tutta la sua maestosità! Anche quì , dopo aver impostto l’immagine, sarà possibile regolarne l’influenza sul materiale. Occhio pero! Sarà meglio utilizzare valori bassi. Solitamente valori oltre lo 0.05 tendono a creare degli strani effetti indesiderati.
A sinistra il nostro materiale ha una heightmap con valore 0.02, a destra invece ha valore 0.08. La superficie della roccia appare distorta! - Occlusion map: Questa texture mira ad aggiungere realismo alla scena simulando l’effetto di occlusione ambientale (che in parole povere è l’effetto che attenua la luce nei punti più profondi della superficie dell’oggetto)
Una maestosissima occlusion map! Ancora la nostra fantastica roccia: senza occlusion map (a sinistra) e con (a destra) - Emission: Permette ad un oggetto di emanare luce! Banalmente, è possibile cambiare colore ed intensità tramite l’apposita paletta colori e il parametro ad esso collegato. Meno banalmente, possiamo creare una Emission map per decidere da quali punti della texture debba essere emanata la luce!
L’emission map usata nell’immagine precedente: ad ogni tonalità di grigio corrisponde una luminosità diversa - Tiling e offset: Gestiscono rispettivamente la scala e la posizione delle texture sull’oggetto
- Secondary maps: Unity ci permette di aggiungere un’ulteriore albedo map ed una normal map da sovrapporre a quelle già usate in precedenza per aggiungere ulteriori dettagli al materiale. Pensa ad esempi a dei graffiti su un muro: Utilizzando una secondary map potrai applicare una scritta alla texture di un muro pulito. Anche qui ritroviamo le impostazioni relative al tiling e all’offset, così da poter regolare la grandezza e la posizione delle secondary maps rispetto alle texture primarie!
La texture utilizzata come emission map riutilizzata come secondary map e con un tiling di 2×2. Che confusione! - Detail Mask: Qui la faccenda diventa ancora più contorta: la detail mask è una texture che decide dove le secondary maps sono visibili e dove no. Anche questa texture funziona in scala di grigio, dove il nero indica una zona invisibile ed il bianco una zona completamente visibile.
Probabilmente la detail mask più insulsa della storia La stessa detail mask applicata al materiale. Non aggiungerò altre texture, lo giuro! - Metallic/Specular: Dulcis in fundo, sono l’unica differenza fra lo “standard shader” e lo “standard shader (specular setup)“. Partiamo parlando del parametro specular (che troverai nella variante specular setup dello standard shader): Esso ci permette di scegliere l’opacità della superficie del materiale tramite il parametro smoothness ed il colore della componente speculare (cioè dei raggi di luce che vengono riflessi dal materiale). Inoltre, utilizzando una specular map possiamo regolare il colore della specularità (tramite i canali RGB) ed il parametro smoothness (tramite canale Alpha) in punti diversi del materiale. Utile quando il materiale a cui stai lavorando non è uniforme ed ha aree più riflettenti di altre (o che dovrebbero riflettere colori diversi).
Il nostro cub di roccia ha adesso una bellissima specular map! La specular map applicata alla roccia Anche il parametro “metallic” dello standard shader gestisce la specularità del materiale, ma lo fa in maniera leggermente diversa: qui avremo a disposizione uno slider che ci permetterà di gestire il carattere metallico della superficie in questione. Il colore del riflesso dipenderà dall’albedo map e non sarà più gestibile tramite una paletta colori . Più alto sarà il valore del parametro metallic, più l’oggetto rifletterà l’ambiente circostante, mentre se il valore sarà più basso verrà lasciato maggiore spazio al colore dell’albedo map. In questo caso, se il nostro materiale richiede valori metallici diversi in punti diversi (pensa ad esempio all’armatura di un personaggio che ha anche punti visibili ricoperti da tessuto, che non è un materiale riflettente) possiamo procedere utilizzando una metallic map. Questa mappa controlla il valore metallico tramite il canale R della texture (cioè il canale rosso) e la smothness del materiale tramite il canale alpha. I canali G e B saranno completamente ignorati!
Insomma, le differenze fra i due workflow sono poche. Utilizza il metodo che ritieni più semplice!
Conclusione
Ok, ma dove becco le texture da utilizzare?
Probabilmente è ciò che ti stai chiedendo a questo punto della lezione! Esistono siti (come game textures) che riescono ad offrirti una libreria di materiali completa di qualsiasi mappa, pronti ad essere utilizzati. Se invece sei abbastanza audace, puoi affidarti a siti come textures.com, la ricerca immagini di google o anche scattare delle foto con la tua fotocamera e da lì estrarre tutte le mappe necessarie con siti come NormalMap-Online o programmi come crazybump o ndo2.
Per questa lezione è tutto! La prossima volta parleremo della gestoine della telecamera in Unity e vedremo come creare tanti effetti spaccamascella senza scrivere nemmeno una riga di codice!