Sei sulla pagina 1di 9

Materials

Ogni modello usa Material differenti. Per esempio, ogni Material di una macchina usa la stessa
texture (TextureAtlas), ma legge parti diverse della Texture, a seconda delle coordinate UV delle
parti della macchina.
Uno Shader definisce:

1. Il modo di renderizzare un oggetto; calcoli matematici come la luce, angolo di visuale, etc.

2. I parametri che possono essere personalizzati nell'Inspector del Material


Un Material definisce:

1. Quale Shader usare per il rendering

2. Valori specifici da passare allo Shader


Texture - Formati di file
1. BMP dimensioni grandi

2. PSD, TIFFS vengono automaticamente convertiti da Unity senza toccare il file originale (non si
ha comunque accesso ai livelli durante il gioco)

3. PNG, GIF, TGA hanno piccole perdite di dettaglio

• PNG Lavorano bene con la trasparenza

• TGA solitamente sono di piccole dimensioni (piccoli header/footer)

4. JPG non gestisce il canale alpha (trasparenza)

5. EXR, HDR high dynamic range, solitamente usato per le ambientazioni

• Non sono limitati a 16 milioni di colori, possono modificarne tra i 10-4 e i 10+8

La maggior parte delle GPU moderne riesce a gestire anche Texture con dimensioni non potenze di
due (NPOT). Le prestazioni si riducono poco, ma occupano più spazio nella RAM, ossia come la
Texture POT maggiore più piccola. È un semplice spreco di spazio. Infine, ci potrebbero essere degli
artefatti sugli spigoli causati dall'interpolazione delle mipmap. Una Texture 25×25 potrebbe avere
una fringe nera dove sono stati aggiunti pixel per far adattare la Texture su oggetti 32×32

Mipmaps
Le Mipmap sono l'equivalente per le Texture dei LOD. Aumentano sia le prestazioni della GPU che la
qualità.
• BorderMipmaps copia i pixel dei bordi su ogni livello delle mipmap, in modo che il "down
sampling" non le scolorisca.

• MipMapsPreserveCoverage scala il valore alpha in modo da garantire la copertura delle


Texture. Questo significa che più pixel passeranno l'alpha test e che le Mip Map inferiori
saranno meno trasparenti

Texture Interpolation
• Nearest Neighbor - Point (no filter)

• Bilinear
• Trilinear

• Anisotropia (filtering)

Bilinear, Trilinear e l'Anisotropic filtering possono lavorare insieme e usano le MipMap. Cambiano il
modo in cui la GPU rappresenta le Texture, ma non hanno alcun effetto sull'utilizzo della memoria
per la Texture.

Le MipMap aumentano di circa 1/3 l'utilizzo dello spazio di archiviazione, ma senza si avrebbe un
significativo Texture aliasing.

Utilizzando il Pointer come interpolazione, si rischia di far diventare apparenti i singoli Texel quando
si ingrandisce la Texture (pixelation), in quanto duplica ogni pixel. 1 Texel fetch per pixel.

Con l'interpolazione Bilinear, invece, si prendono i 4 Texel vicini e li si interpola linearmente in 2


dimensioni. 4 Texel fetch per pixel, 3 interpolazioni lineari.

• 1 lerp tra a e b

• 1 lerp tra c e d

• 1 lerp tra i risultati precedenti

Texture Minification
Quando una Texture viene rimpicciolita, più Texel possono andare a ricoprire la stessa cella di un
pixel. Per prendere il colore giusto per ogni pixel, dovremmo integrare l'effetto dei Texel che
influenzano il pixel.

Il Mipmapping (Multum in parvo) prende la Texture al livello 0 e la riduce a un quarto della sua reale
dimensione, spesso facendo una media dei 4 Texel vicini nella Texture originale.

L'interpolazione Trilinear è simile a quella Bilinear, ma aggiunge una sfumatura tra livelli di MipMap.
Se un pixel è a una distanza dalla telecamera pari a metà tra due livelli di MipMap, farà
un'interpolazione Bilinear sulla Texture di livello superiore, una sulla Texture di livello inferiore e poi
un'ultima tra queste due interpolazioni. Il peso delle Texture è dato dal valore della profondità
rispetto ai 2 livelli di Texture. 8 Texel fetch per pixel, 7 interpolazioni lineari.

FadeOutMipMaps [min, max] mostra dalla MipMap minima alla massima. Se si deve mostrare una
MipMap > della massima, verrà, invece, mostrato il colore grigio.
Questa opzione viene usata per le detail map per decidere a quale distanza un dettaglio debba o
meno essere visto. Funziona anche sulle Texture semplici e sulle normal map. Permette, inoltre, di
evitare l'effetto moiré sulle lunghe distanze.

Le detail map possono essere viste solo da vicino. Se non se ne fa il fade, si rischia un tiling visibile
quando ci si allontana (che è ciò che si sta cercando di evitare con questa opzione).

Il filtro Anisotropic rende le Texture visibili in modo migliore quando le si guardano da una certa
angolatura. Su un piano obliquo rispetto la telecamera, il rimpicciolimento normale con la MipMap
non è sufficiente, in quanto ogni livello è isotropico (stesso valore su diverse direzioni).
L'Anisotropic dimezza ogni asse simultaneamente. Invece di fare solo Texture 128 × 128, 64 x 64 fa
anche 128 x 64 e 64 x 128

Texture filtering best practice


Il filtro Bilinear è il miglior compromesso tra qualità e performance, mentre il Trilinear richiede più
memory bandwidth. Per questo è da preferire un filtro Bilinear Anisotropic 2x piuttosto che un
Trilinear Anisotropic 1x.
Valori maggiori di 2 per il filtro Anisotropic vanno usati esclusivamente in casi critici.

Tipi di Superfici
È possibile scegliere tra due tipi di superfici:

1. Opaque

• Possono avere l'alpha solo a 0 o 1

• Per eliminare dei pixel, usare AlphaClipping/Treshold

• I pixel scartati proiettano comunque le ombre

2. Transparent

• Possono avere qualsiasi alpha compreso tra 0 e 1

• Per eliminare dei pixel, usare AlphaClipping/Treshold


Per fare il blending degli oggetti con il mondo
• Alpha a 0 è completamente trasparente, a 1 opaco. In ogni caso, il Material viene
renderizzato. Utile per oggetti da far apparire solo ogni tanto, come le nuvole.

• Premultiplied preserva i riflessi e le luci anche se trasparente. Solo le luci riflesse, quindi,
sono visibili, come i vetri.

• Additive aggiunge un livello extra sulla superficie del Material. Utile per cose simili agli
ologrammi.

• Multiply moltiplica i colori del Material con quelli dietro. Crea effetti scuri, come quando si
guarda attraverso un vetro colorato.

Edge Padding
Alcune immagini con trasparenza possono avere artefatti "color bleed" lungo i bordi. Le immagini
con gli alpha possono avere pixel colorati completamente opachi, pixel colorati parzialmente opachi
e pixel completamente trasparenti (hanno comunque un valore RGB, bianco per Photoshop).
Quando una Texture viene renderizzata, viene ridimensionata usando un'interpolazione e i pixel
trasparenti vengono mischiati con quelli colorati vicini.

Soluzione

• Abilita AlphaIsTransparency nell'Inspector della Texture

• Assicurati che i pixel trasparenti vicini ai bordi colorati abbiano un valore compatibile (Dilate
filters)

• Segui la guida Unity "Applying Edge Padding to Alpha Textures"

• Se si sta importando un file PSD prova il flag RemoveMatte

Bump Mapping - Normal Map


La Normal Map codifica la normale all'interno del Texel. Può essere fatta rispetto al

• Object Space con un'ampia gamma di colori, tempi di rendering più veloci. È valido solo per
oggetti statici e per telecamere con punto di vista statico.

• Tangent Space solitamente è blu, come il colore associato all'asse y. Può essere usata su
oggetti dinamici e deformati.
Height Map - Parallax Occlusion mapping
È una tecnica simile al normal mapping. Tiene conto dell'angolo di visione, rispetto alla normale della
superficie quando dispone le coordinate della Texture. Mantiene l'illusione della profondità.
Il Parallax Occlusion mapping è un processo computazionale costoso e va usato su piccoli oggetti a
cui ci si può avvicinare molto. Texture lontane hanno un angolo di visuale poco variabile.
Nella Built-in Render Pipeline, una Height Map su uno shader standard deve avere una Mesh con
molti vertici per mostrare il risultato.

Occlusion Map
L'Ambient Occlusion è una tecnica di shading e rendering per calcolare quanto ogni punto sia
esposto alla luce ambientale. Se fornita, puoi scegliere l'occlusione con uno slider nello shader.
Altrimenti è una buona pratica includerlo nell'Albedo.

Detail Map
Permette un secondo set di Texture (Albedo e Normal) sopra la principale, usando dimensioni molto
inferiori e ripetendola più volte sulla superficie, in modo da avere dettagli più nitidi quando ci si
avvicina (dettagli per la pelle, crepe su mura, etc). Detail Mask (A) è una maschera in scala di grigi
che permette di specificare quali aree della Texture avranno i dettagli. Le aree nere saranno senza
dettagli, le bianche con. Per la detail map si possono usare set UV differenti.

Material Scripting
Per cambiare il Renderer Material di un game object possiamo accedere a:

• Renderer.sharedMaterial cambiare questo, cambia il Material di tutti gli oggetti con quel
Material. Cambia anche le impostazioni nel progetto.

• Renderer.Material cambia il Material solo per l'oggetto selezionato. Se il Material è usato da


altri oggetti, viene clonato.

• In questo caso bisogna ricordarsi di distruggere il Material clonato quando l'oggetto


viene distrutto.
Per sapere i parametri pubblici di uno shader vedere i nomi nelle Properties di uno shader.
Per impostare valori:

• Renderer.Material.SetTexture( " _BaseColor", newTexture)


• Renderer.Material.SetTextureOffset(" _BaseColor", Vector2 newUVOffset)

• Renderer.Material.SetTextureScale("_BaseColor", Vector2 UVTiling)

• Renderer.Material.SetFloat("_Smoothness", newSmoothness)

Textures best practices


1. Usa UV appropriate

2. Usa Texture con dimensioni in potenza di 2


3. Lavora su grandi dimensioni, è più facile diminuire la risoluzione con la compressione di Unity
durante l'importazione

4. Linear/GammaSpace

• Le texture che non sono processate come colorate, non dovrebbero essere nello
spazio di colore sRGB, incluse le metallic, roughness e normal map. In caso contrario
si potrebbero avere risultati visivi sbagliati.

• L'impostazione sRGB (Color Texture) non deve essere attiva per le roughness,
specular, normal map e simili

5. L'impostazione Texture Quality in Project Settings/Quality è utile per controllare eventuali


GPU Bound o modificare le impostazioni di qualità in gioco

PBS - Physically based shading


• Chiamato anche PBR (Rendering)

• Modelli avanzati di luci

• Accurata rappresentazione delle interazioni delle luci

• EnergyConservation le superfici non riflettono mai più luce di quella assorbita (a


parte gli oggetti emissivi)

• Microgeometry le superfici hanno una geometria su un livello microscopico. Oggetti


con micro-geometria liscia hanno un aspetto simil-specchio. Oggetti ruvidi, sono
spenti.

Permette di creare Material facilmente con uno Standard Shader (Diffuse, Specular, Bumped e
Reflective mischiati), evitare supposizioni usando dati reali con i dati del Material e avendo un
aspetto corretto in situazioni con luci diverse. Permette un flusso di lavoro per creare artwork
consistenti.

Smoothness/Fresnel
La Smoothness descrive i dettagli della micro-superficie. La Fresnel rende la superficie più riflessiva
ad angoli grazing.

Negli Standard Shader non c'è controllo del Fresnel, è indirettamente controllato da quanto è liscio il
materiale. Superfici lisce hanno un forte Fresnel, le ruvide 0.

Roughness Map valori luminosi definiscono superfici ruvide od opache.

Gloss Map valori luminosi definiscono superfici lisce o patinate.


Dipendono a seconda di come sono impostati gli input dello shader.

Le superfici lisce o patinate riflettono di più lo Skybox di quelle ruvide od opache. In Unity si può
specificare la Gloss Map nel canale alpha de:

• Specular Map

• Metalness Map

• Albedo Map

Metallic Workflow
È composto da 3 componenti:

1. Color BaseMap (RGB) definisce il colore dell'oggetto, indipendentemente dal tipo di


materiale. Solitamente corrisponde al colore percepito.

2. Metalness MetallicMap (R) definisce aree metal (1) o non-metal (0)

• Le aree metal riflettono il 60 ~ 90 % della luce, mentre la non-metal circa il 20%

• Nelle aree metal lo Skybox contribuisce più dell'Albedo

• Solitamente Metalness Map sono nere o bianche. Le aree in scala di grigi sono usate
solo nelle transizioni tra i metal e i non-metal

3. Microsurface Smoothness (A) (Gloss Map) definisce aree patinate o ruvide.

La Reflectivity è il colore riflesso speculare dato dalla Texture Albedo. Le superfici metal possono
apparire come tinte e consumano meno memoria dello Specular Workflow perché è in Bianco &
Nero

Specular Workflow URP


Anch'esso composto da 3 componenti:

1. Color BaseMap (RGB) colore percepito dell'oggetto per le aree non-metal, nero per le aree
metal

2. Specularity SpecularMap (R) definisce il colore metal, grigio scuro per le aree non-metal.
Aree più luminose hanno maggior riflessione
3. Microsurface Smoothness (A) (Gloss Map) definisce aree patinate (1) o ruvide (0)

La Reflectivity è la riflessione speculare del colore dato dalla Specular Map


Un modo facile per capire il workflow utilizzato da qualcuno è vedere se l'Albedo contiene il colore
metallic o meno.

Channel Packing
Lo shader URP Lit usa il channel packing in modo da usare una singola Texture RGBA per le proprietà
metallic, smoothness e occlusion. In questo modo, viene caricata in memoria una sola Texture
invece di tre.

In Substance o Photoshop:

- Red → Metallic/Specular

- Green → Occlusion

- Blue → None

- Alpha → Smoothness

Texture Scripting
Una Texture2D è un array 2D di informazioni sul colore. C'è bisogno di una Sprite o un Material per
visualizzarla. I suoi pixel sono codificati in un array 1D di dimensioni t.width*t.height

Get/Set per un singolo pixel


t.SetPixel(int x, int y, Color c) // Imposta il colore c al pixel x, y
Color c = t.GetPixel(int ×, int y) // Prende il colore nel pixel x,y
t.Apply() // Applica ogni cambiamento fatto ai pixel

Copiare una Texture in un'altra


Color[] colors = sourceT.GetPixels(int MipMapNum)
Texture2D destinationT = new Texture2D(sourceT.width, sourceT.heigth)
destinationT.SetPixels(colors)

Creare una Sprite da una Texture


Sprite s = Sprite.Create(sourceT, new Rect (0, 0, sourceT.width, sourceT.heigth), new Vector2(0.5f,
0.5f))

Da coordinate UV a pixel
(u, v) == (u*t.width, v*t.heigth)

Salvare una Texture2D su disco


byte[] bytes = TextureToEncode.EncodeToJPG()
File.WriteAllBytes(Application.dataPath + "fileName.png", bytes)

DrawTexture
Disegna una Texture sul RenderTexture attivo.
ClearRT ripulisce la Texture con un colore completamente nero.
Draw disegna la Texture nella RenderTexture
LoadOrtho() matrice con cordinate normalizzate
LoadPixelMatrix matrice con cordinate basate sulle dimensioni della Texture

Potrebbero piacerti anche