La Pipeline di Rendering di OpenGL
* * *
La Pipeline di Rendering di OpenGL descrive come le API OpenGL (Open Graphics Library) effettuano il processo di Rendering, ossia il passaggio dalla rappresentazione interna dell'universo virtuale 3D all'immagine rasterizzata da visualizzare sul dispositivo bidimensionale.
In questa Pipeline, i dati sulle geometrie "Vertex Data" (vertici, spigoli, facce) seguono un percorso separato, almeno inizialmente, da quello seguito dai dati "Pixel Data" (pixel, images, bitmaps); la parte finale del processo è invece unica.

(cliccare sull'immagine per ingrandirla)
Tra le componenti software previste vi è anche una lista, detta Display List, ove vengono memorizzati tutti i dati relativi sia ai Vertex Data che ai Pixel Data, in modo da rendere disponibili i riferimenti e i puntatori a tali elementi in qualsiasi momento e da qualsiasi punto della Pipeline di Rendering. Si tratta quindi di un "deposito" a metà strada tra l'applicazione software che invia i dati e la Pipeline vera e propria.
I dati Vertex Data passano attraverso dei "valutatori", detti Evaluators. Alcune geometrie, infatti, vengono progettate o memorizzate come funzioni derivanti da punti di controllo (es.: le NURBS, le Bezier), tuttavia in fase di Rendering è necessario definire dei vertici, per cui gli Evaluators si occupano appunto di valutare tali funzioni, di ricavare i vertici da utilizzare per rappresentare le curve e le superfici.
"Ricavare i vertici" non significa solo ricavare le coordinate dei punti, ma anche le informazioni accessorie, quali il colore della geometria, la direzione delle normali della superficie, le coordinate delle textures, ecc...
A questo punto si hanno le trasformazioni per-vertex, ossia appunto "per ciascun vertice", dove i vertici vengono convertiti in primitive.
In certi casi entrano in gioco anche delle matrici 4x4, ad esempio per effettuare le proiezioni degli oggetti dalla loro posizione nell'universo virtuale 3D (coordinate spaziali) al piano di proiezione. Anche altre informazioni e coordinate (es.: le coordinate delle texture) passano per questa fase, per cui vengono a loro volta trasformate.
Definite le posizioni e le altre informazioni dei vertici, si passa ad assemblare le primitive geometriche, ed in questa fase vengono effettuati anche il clipping, il culling e le operazioni relative allo z-buffer (la distanza, dall'osservatore, degli oggetti; in base a tale valore, è possibile mettere in atto operazioni particolari ed effetti aggiuntivi).
I procedimenti appena elencati riguardano i dati dei vertici; in parallelo, vengono effettuate delle operazioni sui pixel, nel senso che le immagini utilizzate per le textures (memorizzate anche con formati differenti) vengono caricate in memoria, ritagliate, ruotate, scalate, ripetute (se previsto) e i singoli pixel vengono modificati in base, ad esempio, all'illuminazione della scena e ad altri fattori.
Le informazioni così calcolate vengono "impacchettate" in formati ad hoc e copiate in una speciale area di memoria (buffer).
Se vi sono molte texture da applicare ai modelli, verranno creati degli oggetti (nel senso informatico del termine) Texture, da trattare (trasformazioni di traslazione, rotazione, ...; ma non solo: anche semplicemente memorizzazione in aree speciali per recuperarne velocemente i vari puntatori quando servono (switching)) con strumenti opportuni, per cui si avrà una fase di Texture Assembly.
Alcune implementazioni di OpenGL dedicano molta attenzione alle textures (sono fondamentali, ad esempio, nei videogiochi), riservando loro molta memoria.
La fase di rasterizzazione è quella che vede l'unione di geometrie e pixel data per formare i "frammenti" (fragments). Ogni frammento corrisponde ad un pixel, per cui in esso verranno memorizzati i dati relativi al colore, alla trasparenza, eccetera (a seconda della presenza di Anti-Aliasing, i pixel potrebbero subire ulteriori trasformazioni a seconda dei pixel vicini, ...).
Sui singoli frammenti possono essere effettuate poi altre operazioni (per-fragment), che possono comunque essere disattivate, a seconda dei casi; tra queste: generazione dei texel, effetto nebbia (fog), alpha test, antialiasing, stencil buffer test, scissor test, blending, dithering, applicazione di maschere speciali e altro ancora.
Effettuate tutte le operazioni sui frammenti, essi verranno memorizzati nel frame buffer, che poi rappresenta l'insieme dei pixel dell'immagine renderizzata da mostrare a video: OpenGL ha appena realizzato un'immagine (un frame) ! :-)
|