Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Materiali e Shader

Usare gli shader per definire le caratteristiche fisiche di un oggetto (mesh): trasparenza, rifrazione, ombre, etc. Qualità per definire i materiali
Usare gli shader per definire le caratteristiche fisiche di un oggetto (mesh): trasparenza, rifrazione, ombre, etc. Qualità per definire i materiali
Link copiato negli appunti

In questa lezione esploriamo i materiali e gli shader, ovvero ciò che definisce il "come" un oggetto 3D viene renderizzato a schermo.

Cos'è uno shader

Gli shader sono dei modelli matematici che indicano alla scheda grafica come rendere a schermo un oggetto 3D. Descrivono, essenzialmente, come (e se) l'oggetto riceve la luce, che colore ha, se proietta ombre, se riceve ombre, se ha una traslucenza, se crea rifrazioni, se è lucido, opaco, trasparente, e una miriade di altre informazioni.

Com'è ovvio che sia, esistono shader molto complessi, utilizzati su piattaforme PC, e shader semplificati che non tengono conto di molte di queste informazioni, ottimizzati per piattaforme mobile o poco potenti.

Allo stesso modo esistono shader deputati a creare effetti non reali, come gli shader cartoon, che descrivono sugli oggetti delle ombreggiature non naturali ma a fasce più o meno nette, come nei cartoni animati. Alcuni di questi disegnano dei contorni neri intorno alle figure.

Vertex Shader e Pixel Shader

Gli shader si dividono in diverse tipologie. Fra le più usate abbiamo i Vertex Shader, comuni un tempo, che operano a livello di vertici: leggono le caratteristiche della geometria, e partendo dai vertici si ricavano quello che c'è in mezzo. Ad esempio, possono leggere le informazioni di luce dei tre vertici che sottendono un poligono triangolare, e fare la media per disegnare il centro del poligono. È chiaramente un modello impreciso, ma molto molto rapido.

Di contro i Pixel Shader sono shader che lavorano "al pixel": semplificando molto, per ogni pixel che devono renderizzare, partono da un punto sul modello 3D, vanno al corrispondente texel sulla texture, ne leggono il colore, ne leggono il bump (se presente), incrociano il tutto con i valori della luce, e producono il pixel finale che sarà renderizzato. Quest'operazione è chiaramente più pesante rispetto a quella che fa un Vertex Shader, e lo diventa esponenzialmente di più con l'aumentare della risoluzione a schermo (più pixel, molti più calcoli).

Vediamo un esempio di differenze fra un Vertex Shader contro un Pixel Shader, in cui entrambi gestiscono la specular, ovvero il riflesso sulla superficie di una luce forte. Ecco una sfera che utilizza un Pixel Shader:

Pixel Shader

Pixel Shader

Come si può notare (anche se il modello è molto "low-poly"), il pixel shader crea dei giochi di luce più interessanti: la luce sembra venir riflessa in maniera più naturale e crea un alone tondo.

Se cambiamo il materiale affinché usi un Vertex Shader:

Vertex Shader

Vertex Shader

Nel caso del Vertex Shader, poiché questi legge solo le informazione di luce in corrispondenza dei vertici e poi fa un'interpolazione, il riflesso è circoscritto ai poligoni su cui è più forte, ovvero quei 6 triangoli che in figura sono più chiari.

Altre tipologie di shader includono i cosiddetti Unlit (ovvero non illuminati), che non tengono conto delle luci di scena, così come esistono shader Self-Illuminated, che tengono conto della luce ma aggiungono anche una luce propria. Per una lista di tutti gli shader, si può consultare quest'elenco.

Gli shader in Unity

Ecco come si presenta la lista delle famiglie di shader inclusi in Unity, quando selezioniamo lo shader in un Material:

In generale gli shader in Unity sono rappresentati da file .shader, ma Unity contiene tutta una serie di shader di base (quelli nell'elenco sopra appunto) che non appaiono esplicitamente nelle cartelle del progetto e che non sono modificabili.

Per importare nuovi shader, basta piazzare il file .shader nel progetto, e Unity alla prima occasione lo compilerà e lo renderà disponibile per i materiali (vedi sotto). Nella community Unify sono presenti diversi shader pronti all'uso, da importare nel proprio progetto come file .shader.

I Materiali

Ogni Materiale, in Unity, ha alla base uno shader che definisce come viene disegnato ed ombreggiato. Così come lo shader definisce le formule alla base del modello fisico, il materiale definisce i singoli parametri di questo modello.

Potremmo guardare ai materiali come se fossero specifiche regolazioni di uno shader: due materiali che utilizzano lo stesso shader avranno differenze di colore, di texture, di brillantezza, ecc., ma gestiranno la luce e le ombre secondo lo stesso modello fisico.

I materiali in Unity sono dei file .mat che si trovano nel progetto, possiamo quindi crearne uno semplicemente andando nel pannello Project e scegliendo Create > Material (anche dal menu in alto, sotto Assets > Create > Material). Verrà creato un file che possiamo rinominare. Selezionandolo, l'Inspector apparirà inizialmente così:

Questo materiale usa il semplice shader Diffuse, che è un Pixel Shader che supporta un colore, ed una texture. In basso, una finestrella mostra un'anteprima del materiale su una forma di base (che è possibile cambiare tramite i tastini sulla destra, vicino al play).

Abilitare le trasparenze

Essendo Diffuse uno shader non trasparente, se selezioniamo come Main Color un colore con trasparenza (vale a dire, impostiamo 'alpha nel pannello sotto) noteremo che l'oggetto non diventa semitrasparente e non scompare. Per renderlo semitrasparente, dobbiamo assegnare uno shader che supporti l'alpha: clicchiamo sul menu a tendina Shader, e selezioniamo Transparent > Diffuse.

L'Inspector quasi non è cambiato, ma se modifichiamo i valori dell'alpha del Main Color l'oggetto diventerà trasparente, perché lo shader utilizzato dal materiale tiene conto di questa proprietà.

Assegnare i materiali alle mesh

Ora che abbiamo creato il materiale, possiamo assegnarlo agli oggetti in scena o ai prefab nel Project. Per farlo ci sono diversi metodi: si può trascinarli direttamente dal Project all'oggetto nella Scene View, oppure si può andare nel Mesh Renderer di un oggetto e selezionare il Material tramite l'apposito browser, a cui si accede premendo le iconcine a forma di cerchietto.

Shader complessi

Se vogliamo vedere uno shader più complesso in azione, selezioniamo come shader Self-Illumination > Bumped Specular. L'Inspector apparirà così:

In questo caso, questo shader supporta tutta una serie di parametri extra: autoilluminazione, riflesso della luce (specular), lucentezza (shininess), ed addirittura una texture Normal per aggiungere effetti di rilievo (Normal Map).

Unity mostra anche un avviso: poiché abbiamo scelto uno shader che supporta le normal map, ma non ne stiamo usando una, potrebbe convenire sceglierne un altro perché altrimenti il renderer farà dei calcoli extra (per le normali) che non produrranno un effetto visibile.

Vedremo le texture ed altri parametri dei materiali più in dettaglio nelle lezioni specifiche.

Ti consigliamo anche