Il normal mapping è una tecnica ormai di uso comune in computer grafica. La logica dietro è abbastanza semplice. Invece di utilizzare le normali che si trovano nei triangoli, si utilizzano particolari texture (le normal map) i cui colori RGB rappresentano la direzione della normale in quel pixel. In questo modo l'illuminazione non è uniforme in tutto il triangolo ma dipenderà dalla normal map. Un esempio immediato è quello di un muro. Invece di utilizzare migliaia di mattoni si può utilizzare una normal map per simulare il rilievo. Invece di migliaia di mattoni e quindi migliaia di triangoli, basterà un rettangolo con una normal map appropriata per dare un effetto di rilievo (nei limiti ovviamente del possibile).
Questa tecnica prende il nome di Glow e permette di migliorare la qualità dell’illuminazione della scena.
Una luce, infatti, genera intorno a se un alone luminoso che rende l’aspetto dell’oggetto più realistico, per capire cosa sia il Glow basta immaginare una fiamma o le luci al neon.
Passiamo a spiegare il funzionamento della demo.
La tecnica si divide fondamentalmente in tre passaggi da eseguire in questo preciso ordine:
Rendering dell’oggetto, o degli oggetti, che compongono la scena.
Rendering, su una Surface, dell’oggetto, o degli oggetti, che generano un alone.
Blur dell’immagine renderizzata sulla Surface. ...
Questo demo mostra un effetto in post processing noto come traslucidità. L'effetto vuole simulare quei materiali che variano di colore a seconda di quanta luce ci passi al suo interno.
L'HDR (High Dynamic Range) è un nuovo modo di creare la luce. Prendiamo ad esempio una foto che inquadra un oggetto ed una fonte di luce. Se con un programma diminuiamo la luminosità vedremo che l'oggetto diventa più scuro ma che anche la luce diventa più scura. Questo è sbagliato. La luce dovrebbe mantenere la sua luminosità molto più a lungo. Per ovviare a questo si usano come render target non più il backbuffer a 32bit( 8 per colore equivalenti a 256 variazioni) ma a 64 e 128bit (corrispondenti a 65536 e 4 miliardi di variazioni). Questo permette di dare ai colori maggiori differenze cromatiche. Di questa texture mostreremo a video solo un intervallo (lo schermo rimane sempre a 32bit)....
Ecco un sistema molto semplice per generare scariche elettiche. Il tutto si basa su una semplice funzione che sfruttando la coordinata texture del quadrato su cui si renderizza la scarica elettrica calcola il suo valore di luminosità. Il rettangolo è per ora messo a tutto schermo ma non è difficile posizionarlo dove serve e, sfruttando la trasparenza in alpha, poterlo disporre sui personaggi. ...
Ecco un semplice ma efficacissimo sistema per poter visualizzare effetti di rifrazione nelle vostre scene (fondamentale per poter visualizzare correttamente il fondo di recipienti d'acqua o del mare). La scene viene prima renderizzata su una texture e successivamente posizionata tramite vertex shader su un rettangolo che sarà il nostro specchio d'acqua. L'esempio mostra questo aggiungendo una texture per il bump e calcolando il valore della profondità per poter aggiungere il calo della trasparenza dovuta al fatto che l'acqua non è mai perfettamente pulita e quindi la visibilità diminuisce. La scena è renderizzata in dot product bump mapping.
Il fuoco è un elemento fondamentale per molti giochi. Realizzare un fuoco credibile è sempre stato difficile richiedendo migliaia di trucchi (immagini precalcolate, bump mapping etc). Oggi con i pixel shader 2.0 è possibile realizzare il fuoco calcolando in tempo reale il movimento della fiamma. Esistono moltissimi algoritmi. Ve ne propongo uno. La tecnica non fa altro che renderizzare su un quadrato a pieno schermo una fiamma generata da una noise map (una texture cubica che ha lo scopo di perturbare la fiamma) ed una linea contentente i vari colori della fiamma. L'algoritmo è un pò complesso ma di facile impiego.
Questa tecnica è semplice ma efficacissimo sistema per migliorare le luci presenti nella scena. Ua luce infatti oltre ad illuminare la scena genera intorno a se un alone luminoso che ne risalta il colore. La procedura è relativamente semplice. Su una texture renderizziamo la scena normale mentre su una seconda solo le parti luminose...
Questo è uno shader creato da me che vuole simulare il tratto chiaro, scuro fatto con la china. L'effetto sfrutta numerosi passaggi per essere realizzato. Il primo passo è un rendering multiplo su tre texture. Nella prima viene renderizzata la scena normale illuminata in perPixel lighting, sulla seconda il depth space e sulla terza il normal space. Il depth space ed il normal space sono il rendering della scena in cui però il colore è utilizzato come informazione. Il depth compare come una scena in sfumature di grigio in cui più il colore è vicino al bianco e più la scena è lontana. Il normal space invece usa come colore la normale. Questi due spazi vengono utilizzati per generare il contorno tramite filtro sobel. ...
Nonostante perda gran parte, dell'interesse la perPixelLighting può essere effettuata anche senza una mappa normale, ma sfruttando le normali della mesh. Si perde la gestione del rilievo ma se non serve si ha comunque un miglioramento incredibile dell'illuminazione. La normale luce infatti viene per dire rovinata dal fatto che il calcolo è preciso solo nel vertice mentre il risultato è interpolato nel triangolo. Se non ci sono molti poligoni il modello mostra tutta la sua "triangolatura". Con la perPixelLighting anche un modello con pochi poligoni mostra una illuminazione assolutamente perfetta e pulita come potete vedere....