Praticamente tutti i moderni
giochi per computer si trovano davanti al problema di fornire
una rappresentazione su uno schermo bidimensionale di una
realtà virtuale in tre dimensioni. Il processo di
conversione dalla realtà virtuale alla rappresentazione
2D sullo schermo prende il nome di Pipeline 3D. Per chi non ne è
familiare, il concetto di pipeline in informatica consiste nel
dividere il lavoro da portare a termine in diversi stadi, ciascuno
controllato da un'unità diversa ed eseguire il lavoro
come una catena di montaggio: appena uno stadio ha completato
il proprio compito, inizia a lavorare su quello successivo,
senza aspettare che il lavoro sia ultimato anche dagli altri
stadi.
Per capire meglio questo concetto, si pensi a questo esempio:
supponiamo di dover gestire una lavanderia. Per ogni capo di
abbigliamento dobbiamo eseguire tre fasi distinte e
consecutive: lavaggio, asciugatura e stiratura. Supponiamo per
semplicità di avere una sola lavatrice, una sola
asciugatrice e una sola persona addetta allo stiro e che
ciascuno riesca lavare, asciugare o stirare un abito all'ora.
Perché un abito sia pronto sono necessarie tre ore.
Completato il processo su un abito, si ricomincia l'operazione
con l'abito successivo. Questo è un sistema non
particolarmente intelligente: la lavatrice infatti così
lavorerebbe soltanto per un ora ogni tre e sarebbe spenta per
due ore. Il modo efficiente per gestire la lavanderia è
chiaramente quello di iniziare a lavare il secondo capo appena
il primo è stato lavato e passa all'asciugatrice.
Questa è l'essenza della Pipeline. A regime, ad ogni
ora viene completato un abito, pur essendo la velocità
di lavaggio immutata (richiede tre ore dall'inizio alla fine);
il trucco è che più abiti vengono processati
contemporaneamente.
Nella Pipeline 3D si parla di punti dello schermo e non di abiti. Ogni
fotogramma (in inglese frame)
è composto da punti e la potenza della pipeline 3D
risiede nel fatto che i punti dell'immagine sono indipendenti
l'uno dall'altro e possono essere calcolato organizzando
l'elaborazione in pipeline.
In realtà quanto detto non è propriamente
esatto: le pipeline infatti sono due, quella geometrica (dove
i protagonisti sono i vertigi dei triangoli) e quella dei
punti.
Descriviamo brevemente questi stadi di elaborazione della
pipeline 3D:
- Primo stadio: aggiornamento del database. La scena da
riprodurre viene rappresentata schematicamente in termini di
punti, linee, poligoni o figure più complesse. La
realtà, ridotta a primitive elementari, viene quindi
facilmente animata dal motore di intelligenza artificiale
che, per ciascuno di questi elementi, applica le opportune
equazioni matematiche che permettono di calcolare la loro
posizione nello spazio ad un preciso istante temporale.
Questo stadio è ad opera della CPU e propriamente non
fa parte della pipeline 3D. La scena alla fine viene
descritta in termini di vertici:
questi sono gli spigoli di triangoli. Il triangolo è
infatti la figura geometrica più semplice da
elaborare ed è perfettamente nota una volta descritti
i tre vertici. Da notare che, per triangoli adiacenti,
alcuni vertici sono comuni, per cui spostare un vertice
implica operare su più triangoli contemporaneamente.
I dati dei vertici vengono quindi passati al processore
grafico, la GPU, che porta avanti il resto
dell'elaborazione. In FS questo stadio si occupa di
calcolare la posizione del proprio aereo all'interno della
scena da visualizzare (in base alle dinamiche di volo), di
calcolare la posizione degli aerei AI, di calcolare quali
oggetti 3D devono apparire (autogen, hangar, edifici
aeroportuali, ecc...), la posizione delle nuvole ecc...
- Secondo stadio: elaborazione geometrica. In questo stadio
la scheda video può applicare delle trasformazioni ai
vertici in base a determinati programmi molto semplici.
Questi programmi permettono di modificare la posizione di
alcuni vertici e di calcolare un valore di illuminazione per
i medesimi in base alle luci presenti. La capacità di
modellare vertici è stata introdotta con la versione
7 delle librerie Direct3D e supportata per prima dalle
schede GeForce di nVIDIA. Allora i programmi non erano
flessibili: era possibile solo usare una determinata
sequenza di passi per trasformare ed illuminare la scena. La
tecnica prendeva il nome di Transform & Lightning (T&L). Con
la nVIDIA GeForce 3 e la ATi Radeon 8500, tale tecnica
è stata evoluta con la possibilità di usare
programmi personalizzati. L'unità in grado di
elaborare questi programmi è definita Vertex Shader e il
linguaggio di programmazione è stato standardizzato
con le Direct3D 8.1 e aggiornato con le 9. Le attuali schede
dispongono diverse unità di Vertex Shader che
lavorano in parallelo su diversi vertici: infatti i
programmi di Vertex Shader lavorano con un solo vertice alla
volta. Tipiche funzioni del Vertex Shader sono le animazioni
dei personaggi, in particolare quelle che riguardano i volti
dei medesimi e dei tessuti, troppo dispendiose se fatte fare
alla CPU visto l'alto numero di punti, mentre la GPU dispone
di batteria di unità dedicate proprio per questo e
quindi l'elaborazione è molto più efficiente.
Ancora una volta, ogni vertice può essere elaborato
indipendentemente, per cui l'esecuzione in pipeline risulta
molto efficiente. FS2004 utilizza il vertex shader (o meglio
il T&L) soltanto per animare gli oggetti, compresi i
flap, i carrelli e le parti mobili degli aerei. Questo
spiega perché nei vecchi aerei disegnati per FS2000
non si vedono le parti animate se vengono usati in FS2004.
Il Vertex Shader può essere comunque simulato via
software dalle Direct3D qualora non sia presente il supporto
hardware. Qualora la funzione "Transform & Lightning"
sia attivata nella configurazione, viene usato un programma
di Vertex Shader anche per calcolare l'illuminazione della
scena, quindi la luce su tutti i punti dello scenario. La
medesima è evidente nei riflessi del Beacon
sull'aereo oppure nell'ombra nelle valli. Qualora l'opzione
sia disattivata, il Vertex Shader per le animazioni rimane
(e viene gestito in software dalle Direct3D se non presente
nella scheda), ma le luci vengono calcolate dalla CPU, con
aggravio dei tempi di calcolo.
- Terzo stadio: clipping. La scena così calcolata
è pronta completa e può essere renderizzata.
La prima cosa intelligente da fare è eliminare in
partenza oggetti che non rientrerebbero nel campo visivo,
per non aggravare inutilmente i tempi di calcolo;
l'operazione viene chiamata clipping. Per prima cosa vengono
eliminati i vertici dei triangoli la cui faccia è
rivolta dalla parte opposta alla camera (Backface culling).
Questa operazione è immediata, perché i
triangoli sono sempre "a singola faccia" e le coordinate
espresse in senso orario. Per cui è facilissimo
identificare i "triangoli rovesci". Quindi si applicano i clipping plane, una
serie di piani immaginari che definiscono i limiti di
visualizzazione della camera. In pratica la camera è
posta al vertice di una piramide e i clipping plane sono i
lati della piramide: quello che ricade dentro al volume
della piramide sarà presente nella scena finale,
mentre i vertici che non ci ricadono possono essere
eliminati. i punti che risultano essere al di fuori del
campo visivo (ossia le cui coordinate eccedono i limiti
dello schermo) vengono eliminati. Qualora parte dei
triangoli risultino parzialmente visibili, vengono aggiunti
gli opportuni vertici e quindi creati triangoli più
piccoli.
- Quarto stadio: viewport. I vertici rimanenti, trasformati
ed illuminati, sono riferiti ad un preciso sistema di
coordinate, che non è quello della camera
dell'osservatore, una uno globale e basato sulle tre
coordinate del sistema cartesiano (x,y,z). In questo stadio
per tutti i vertici vengono ricalcolate le coordinate in
modo da riferirsi al punto in cui è posto
l'osservatore. Questo viene fatto con funzioni di
traslazione, rotazione e amplificazione, in modo da avere
anche la corretta resa prospettica e attraverso una
particolare matrice di trasformazione. Il risultato finale
di questo stadio è che, ignorando la coordinata z, le
coordinate x ed y corrispondono ai punti dello schermo.
Quindi si è trasformata la scena da tridimensionale a
bidimensionale.
- Quinto stadio: setup dei triangoli A questo punto il ciclo
di vita dei vertici finisce e inizia quello dei pixel. Per
prima cosa vengono creati in memoria i triangoli frutto
dell'unione dei vari punti. Ciascun triangolo genera quindi
una serie di punti che entrano nella Pixel Pipeline.
- Sesto stadio: Rasterizzazione.A ciascun punto di ogni
triangolo viene assegnato un opportuno livello di colore e
luminosità, dato dall'interpolazione delle
proprietà dei tre vertici: il colore, il materiale e
la luminosità dei vertici quindi si riflettono nel
colore che avrà ogni punto di ogni triangolo. Parte
della rasterizzazione è anche il multisampling, in cui
viene fatta corrispondere ad ogni punto la coordinata di una
o più texture da applicare a quel punto.
- Settimo stadio: shading. In questo stadio per ogni punto
viene assegnato un colore ad ogni punto di ogni
triangolo. Il colore viene deciso in base alle
proprietà calcolate dalla rasterizzazione, ossia
dipende quindi dai texel
(così si chiamo i pixel di una texture) che vi
sono associati (e possono esserci più texture
applicabili nello stesso punto), dalla luminosità e
dal materiale. L'applicazione delle texture, come vedremo in
seguito potrebbe non essere così immediata e banale:
potrebbe essere necessario elaborare opportunamente dette
texture con gli opportuni filtri (lineare, bilineare o
anisotropico). Questo stadio è elaborato da apposite
unità dette Pixel
Shader. Introdotte dalla GeForce 3 prima e dalla
Radeon 8500 poi, queste supportano, al pari del Vertex
Shader, dei piccoli programmi in grado di applicare effetti
speciali sulle texture, come illuminazione calcolata a
livello di pixel, translucenza, opacità, e altri
effetti dipendenti dal tempo (il punto della texture da
utilizzare può essere un intorno del punto ideale
calcolato nel multisampling, e funzione di una opportuna
equazione). Da notare che, sebbene il Pixel Shader sia
supportato dalle Direct3D 8.1 al pari del Vertex Shader, non
è stata introdotta una sua emulazione software. Le
applicazioni Pixel Shader vengono semplicemente non eseguite
se l'hardware non le supporta. Al pari del suo collega, ogni
GPU ingloba in genere più unità di
elaborazione che lavorano in parallelo su punti diversi. In
Flight Simulator 2004 viene usato il Pixel Shader per
rendere gli effetti dell'acqua (che di fatto consistono in
una traslazione della texture da applicare in funzione del
tempo), del riflesso del sole e della luna sull'acqua, per
applicare l'effetto di resolution
enhancement sulle texture del terreno e per rendere
gli effetti di riflessione sull'aereo. Tutte queste funzioni
chiaramente non sono visibili solo qualora si usi FS2004 su
una scheda video senza Pixel Shader, quindi più
antica della GeForce 3 o della Radeon 8500.
- Ottavo Stadio: back end. In questa ultima parte
dell'eleborazione, viene composta l'immagine finale: i
triangoli elaborati in principio potrebbero sovrapporsi (si
pensi alle superfici trasparenti), per cui bisogna decidere
quale punto alla fine mostrare a schermo. Vengono fatti una
serie di test sui pixel dello schermo, utilizzando le
informazioni sulla coordinata Z associata ad ogni punto.
Prima viene applicato il fog, ossia viene svumato verso un
certo colore i punti oltre una certa distanza. Poi viene
calcolato l'alpha blending per realizzare gli effetti di
trasparenza e calcolare il valore finale del pixel dello
schermo. Quindi si passa agli ultimi effetti sull'immagine
finita, come l'antialiasing
(che è un filtro che permette di interpolare i punti
dell'immagine in modo da rendere l'immagine stessa
più sfumata e quindi meno scalettata). Le funzioni
della nebbia e dell'antialiasing, in FS vengono applicate in
quest'ultimo stadio.
A questo punto il fotogramma è completo e può
essere inviato al frame buffer, ossia quella parte di memoria
video che contiene l'immagine finale e che componente della
scheda provvederà ad inviare allo schermo alla
frequenza di refresh stabilita.