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.
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):
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).
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.
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).
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 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.
Alla fine della fase di rendering vengono effettuati tutta una serie di test, che permettono di realizzare effetti particolari:
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.