La Pipeline Grafica


La pipeline grafica e' un insieme di operazioni e trasformazioni geometriche, effettuate in sequenza sugli elementi grafici, che trasforma figure tridimensionali (3D), in valori di illuminazione dei punti dello schermo.

Utilizza tecniche grafiche che sono sono state sviluppate per lo piu' negli anni 70 ed 80; col tempo il loro uso si e' di fatto standardizzato, o quasi, per cui i diversi fornitori implementano, sui loro prodotti, funzioni simili. La grafica 3D e' utilizzata spesso per giochi, ed altre applicazioni con immagini in movimento, ove occorre disegnare l'immagine 30-60 volte al secondo, occorrono quindi grandi prestazioni, piu' di quanto la CPU riesca a fornire.

La pipeline e' quindi in parte implementata in hardware, da apposite schede grafiche, che sono veri e propri processori paralleli, di grande potenza e complessita'. I fornitori di schede grafiche producono, assieme alle schede, il software per utilizzarle, come driver e le librerie di funzioni software che sono usate dagli sviluppatori. C'e' uno stretto legame fra la struttura interna delle schede ed i dettagli del software per il loro uso; per questo i fabbricanti di schede non forniscono dettagli sul software, che viene distribuito in forma chiusa (senza il source); i driver, per Linux, sono implementati come moduli proprietari del kernel, distribuiti in forma binaria.

Anche le librerie per l'uso delle schede si sono in qualche modo standardizzate, ed oggi (2008) esistono due interfaccie per l'uso delle schede grafiche (dette API: Application Standard Interfaces): le OpenGL, sostenute da un consorzio di fornitori, ed originate dalle librerie create negli anni 80 dalla SGI per le sue workstation grafiche; e le DirectX della Microsoft, per l'uso delle schede grafiche con Windows.

Le API forniscono al programmatore una loro visione della pipeline grafica, che e' quella che il software applicativo "vede" e puo' non corrispondere nel dettagli a quello che vien fatto nella scheda grafica, che cambia da fornitore a fornitore, da modello a modello e non sempre viene reso noto.

Ad ogni modo si puo' dire che la pipeline grafica consiste delle seguenti fasi:

Il "geometry stage" e' effettuato nelle moderne schede grafiche in hardware, da componenti chiamate "vertex shaders", ce ne sono piu' di uno, che operano in parallelo su diverse parti dell'immagine. Le unita' che effettuano il "raster stage" sono dette "pixel shaders" ed anche qui ce ne sono piu' di una, che lavorano in parallelo. Ci sono poi unita' speciali per il calcolo e l'applicazione delle texture.

Le texture sono immagini bidimensionali che rappresentano le superfici, come rugosita' delle pareti, disegni dei pavimenti, zone di cielo, ed anche la superficie della pelle, dettagli dei volti etc.; tutte queste cose possono essere rappresentate come disegni in due dimensioni (2D) che vengono poi incollate sulle superfici dei triangoli.
Ogni punto della texture ha 2 corrdinate, in genere indicate come: (u,v), queste vengono messe in corrispondenza dei punti di coordinate (x,y,z) del vertici dei triangoli.


Geometry stage:

In questa fase si calcola la luce della superficie ai vertici dei triangoli, i triangoli vengono poi ruotati e proiettati sulla superficie dello schermo. Qui non si entrera' nei dettagli del calcolo; la matematica di tutto questo non e' poi tanto complicata, ma bisogna avere un po' di nozioni di base.

Le superfici degli oggetti da disegnare sono rappresentate come un reticolo di triangoli. I triangoli sono figure semplici e possono ricoprire una superficie curva senza buchi (come sarebbe per dei rettangoli), pero' ci vogliono molti triangoli per rappresentare in modo accettabile superfici curve. Forme geometriche piu' complesse dei triangoli richiedono meno elementi per rappresentare le superfici, ma sono piu' complicati da disegnare e non si prestano bene ad essere trattati in hardware. Per questo risulta conveniente utilizzare triangoli, anche se sono molti si trattano velocemente usando hardware dedicato.

I triangoli sono rappresentati dai loro vertici, che hanno una posizione, un colore, una perpendicolare alla superficie (la normale).
I colori sono rappresentati tramite le loro componenti RGB (rosso, verde e blu), 3 numeri per ogni punto, che esprimono le intensita' dei colori fondamentali, in piu' c'e' un valore che determina la trasparenza (alfa). Ci sono anche altri modi di esprimere i colori, ma qui assumeremo la questa rappresentazione: RGBA, con ogni valore che va da 0 ad 1. Un colore con tutti valori eguali a 0 e' nero, un colore con valori eguali ad 1 e' bianco.

In questa fase della pipeline gli oggetti sono ruotati e proiettati sul piano dello schermo; per trattare nello stesso modo rotazioni e traslazioni, i punti sono rappresentati in uno spazio a 4 dimensioni, quello che i matematici chiamano "spazio affine". In questo modo tutte le trasformazioni geometriche possono essere rappresentate come trasformazioni lineari, esprese da matrici, che operano su vettori. Nelle moderne schede grafiche c'e' hardware apposito per effettuare queste operazioni matematiche.

Il calcolo della luce di ogni vertice del triangolo e' effettuato in base ad un modello fenomenologico, che non rappresenta il vero processo fisico della diffusione della luce da parte delle supefici, ma in pratica funziona abbastanza bene e da' un effetto che sembra realistico.
La formula per il colore di un vertice e' del tipo seguente (ci sono 3 equazioni, una per ogni componente RGB):

Phong equation: modello di illuminazione

il valore del colore di un punto e' quindi dato dalla somma di una serie di termini:

In figura (dalla Wikipedia) un'immagine che mostra l'efetto dei diversi termine del modello di illuminazione sopra descritto (detto modello di Phong).

modello di illuminazione di Phong

Una volta illuminati i vertici dei triangoli vengono ruotati e proiettati, in modo da riportarli sulla superficie dello schermo. Per trattare nello stesso modo rotazioni e traslazioni, i punti sono rappresentati in uno spazio a 4 dimensioni, quello che i matematici chiamano "spazio affine". In questo modo tutte le trasformazioni geometriche possono essere rappresentate come trasformazioni lineari, espresse da matrici, che operano su vettori. Nelle moderne schede grafiche c'e' hardware apposito per effettuare queste operazioni matematiche.

proiezione

A questo punto c'e' la fase di "clipping", alcuni triangoli sono un po' fuori un po' dentro la zona visibile, vengono quindi "ritagliati" in modo da fare nuovi triangoli, con tutti i vertici visibili. Vengono anche esclusi dal disegno oggetti fuori dalla visuale (object rejection) e supefici che non sono rivolte verso il punto di vista (back-face culling).


Rastering Stage.

In questa fase vengono calcolati i valori dei colori dei punti dello schermo, interpolando i valori ai vertici dei triangoli. Ci sono diversi modi di interpolare, che prendono il loro nome dai ricercatori che li hanno introdotti:


Nella figura sotto il confronto fra il flat ed il Gouraud shading, si vede come il Gouraud shading comuffi i bordi dei triangoli e come, modulando i colori, la superficie sembri piu' tondeggiante. Sotto ancora confronto fra flat e Phong shading, il Phong shading rende meglio gli effetti speculari e le superfici. Le schede grafiche in genere implementano in hardware il flat ed il Gourand Shading, solo recentemente si e' iniziato ad usare il Phong Shading.

flat shading Gouraud shading

Phong e flat shading

Nella fase di rendering vengono anche applicati alle superfici le texture. Ed i colori dei punti interni dei triangoli vengono combinati con i colori delle texture; siccome i valori dei colori sono in genere rappresentati da numeri fra zero ed uno, e per combinare i colori delle texture si moltiplicano fra loro i loro valori, accade che combinando piu' colori si finisca per avere colori molto scuri, come si oserva in alcuni videogiochi. Anche l'illuminazione di superfici puo' essere rappresentata da texture, e le texture vengono utilizzate per molti effetti speciali, come rendere rugose le superfici etc., ci possono essere anche texture animate, per rappresentare superfici che cambiano colore.
Nelle schede grafiche sono anche implementati metodi complicati per migliorere l'applicazione delle texture, tenendo conto degli effetti prospettici e della distanza dall'oggetto. Nella tecnica detta: "mipmapping" vengono utilizzate diverse versioni delle texture, via via rimpicciolite ed utilizzate se la superficie e' distante. Quando poi, cambiando la distanza, ad un pixel dell'immagine corrispondono piu' punti della texture questa viene "filtrata"; nel bilinear filtering si media sui punti vicini della texture, nel trilinear filtering si media anche sulle texture di dimensioni diverse, da usarsi per diverse distanze; nell'anisotropic filtering si media in modo diverso lengo le 2 dimensioni della superficie, questo serve per tener conto di effetti prospettici, che si osservano quando la superficie e' inclinata rispetto alla linea di vista.
In figura un esempio di texture applicata ad una sfera. Si vede come la mappatura possa essere fatta in diversi modi.

texture su una sfera

Alla fine della fase di rendering vengono effettuati tutta una serie di test, che permettono di realizzare effetti particolari:


Il Frame Buffer

I valori di illuminazione e colore calcolati per ogni pixel sono scritti infine su una zona di memoria detta "frame buffer", il frame buffer viene riportato sullo schermo dall'elettronica della scheda grafica.
In Genere ci sono 2 frame buffer (talvolta 3), mentre si riporta uno sullo schermo si disegna l'immagine sull'altro. La componente che trasforma i valori del frame buffer in segnali video analogici e' detta: RAMDAC (random Access memory Digital Analog Converter), questi segnali vengono inviati al video coi segnali che pilotano il fascio di elettroni lungo le linee e le colonne dello schermo. In caso di video digitali questa conversione non serve, possono essere utilizzati direttamente i valori digitali dei colori e la trasmissione dei dati al video avviene in modo diverso.

La scheda video puo' produrre diversi tipi di segnali:

Sono in studio altri modi di trasmettere il segnale, con appositi connettori, che pero' non sono ancora entrati in uso. In figura connettori VGA, DVI, RCA, S-video.
I connettori RCA usano un cavo per il video (giallo), e due per i 2 canali stereo dell'audio.

VGA DVI RCA S-video