Il Vertex Shader è
la prima parte di quella tecnologia che nVidia ha chiamato
nfiniteFX Engine. Con questa terminologia si vuole
sottolineare la possibilità offerta agli sviluppatori
di programmare nuovi effetti grafici operando con le numerose
funzioni ridefinibili e le istruzioni presenti in questo nuovo
motore di rendering.
Il Vertex Shader non è
altro che un potente processore SIMD (Single Istruction,
Multiple Data) capace di eseguire manipolazioni sulle geometrie
tramite programmi definiti dagli sviluppari. Il processore
agisce nella fase di Trasform & Lighting. Normalmente
in questa fase i vertici dei modelli vengono prelevati dalla
memoria, trasformati secondo operazioni geometriche, sottoposti
a calcoli di illuminazione e proiettati sullo schermo. I normali
motori di T&L (es: quelli del GF, GF2 e Radeon) mettono
a disposizione una serie molto limitata di macro-funzionalità
predefinite che i driver si occupano di richiamare nella giusta
sequenza.
Il principio di funzionamento
del Vertex Shader è diverso ed è all'insegna
della libertà assoluta. Il potente processore vettoriale
che lo costituisce esegue vere e proprie istruzioni che permettono
di eseguire manipolazioni elementari sui vertici dei poligoni.
Una opportuna sequenza di istruzioni può dar luogo
alle funzionalità classiche del T&L con la differenza
del controllo totale e della possibilità di personalizzarle
secondo le proprie esigenze.

Il
processore SIMD del Vertex Shader può infatti eseguire
un programma costituito da un massimo da 128 istruzioni scelte
da un gruppo di 17 che elaborano i dati relativi ad un vertice
(memorizzati in un buffer di ingresso di 128bit x 16) con
l'appoggio di una memoria delle costanti (96 x 128bit), un
banco dei registri temporanei (12 x 128bit) e un buffer di
uscita (15 x 128bit).
Le
istruzioni sono poche (appena 17) e relativamente semplici,
inoltre non sono ammessi cicli ed il programma viene quindi
elaborato dall'inizio alla fine senza diramazioni. Questo
schema apparentemente rigido di elaborazione è stato
così definito per evitare problematiche di debugging
dei Vertex Program e per semplificare il silicio del chip.
Queste istruzioni operano contemporaneamente
su 4 dati in virgola mobile per ciclo di clock (da cui il
nome SIMD) e maneggiano quindi sempre dati a 128bit (32bit
x 4). Le operazioni eseguibili vanno dalle classiche somme
e moltiplicazioni in virgola mobile, alle più complesse
medie pesate, calcolo della distanza tra vettori, funzioni
di illuminazione, logaritmi, calcoli del reciproco e della
radice quadrata.
Le
17 istruzioni semplici vengono eseguite in un solo colpo di
clock ed operano su un solo vertice alla volta, per ottenere
calcoli più complessi dobbiamo creare una sequenza
di istruzioni semplici; qui elenchiamo il numero di istruzioni
necessarie per eseguire elaborazioni tipiche:
Vector
cross product: 2 istruzioni
Divisione: 2 istruzioni
Calcolo della radice: 2 istruzioni
Prodotto di un vettore per una matrice: 4 istruzioni
T&L con una luce direzionale: 7 istruzioni (28 milioni
di triangoli a 200MHz)
Log ad alta precisione: 9 istruzioni
Exp ad alta precisione: 9 istruzioni
Seno/Coseno: da 9 a 13 istruzioni
T&L con una luce speculare: 18 istruzioni (11 milioni
di triangoli a 200MHz)
Inversione di matrice: 38 istruzioni
Illuminazione con 17 luci: 126 istruzioni
Una particolarità da sottolineare
è che l'uso del Vertex Shader è completamente
alternativo al tradizionale motore di T&L che è
comunque sempre presente. Questa scelta è stata dettata
da esigenze di compatibilità con il passato ed ha gravato
senza dubbio sul numero di transistor complessivo. Da riportare
anche alcune voci che dichiarano essere due i motori di Vertex
Shading presenti nel futuro chip3D dell'X-Box, in questo caso
il T&L ridondante non sarebbe presente per risparmiare
transistor. In ogni caso nella GF3 il motore di T&L e
il Vertex Shader non sono utilizzabili in parallelo.
Cosa possiamo fare con questo
potente motore di manipolazione geometrica?
Le funzionalità possibili sono molte, analizziamo solo
le più interessanti ricordando che solo la fantasia
e la bravura dei programmatori ne decreteranno il numero che
effettivamente vedremo all'opera:
Animazione scheletrica
Nei modelli geometrici complessi,
come il corpo umano, risulta di fondamentale importanza l'animazione
scheletrica ossia l'adozione di uno scheletro che controlla
il movimento gerarchico dei vari triangoli che costituiscono
le membra del modello.
I pologoni di un dito devono
essere ruotati e spostati secondo la posizione reciproca dei
nodi di controllo del polso, dell'avambraccio, del braccio,
della spalla e infine del busto. Per poter gestire modelli
complessi è quindi necessario poter applicare manipolazioni
multiple ai vari gruppi di triangoli secondo numerosi parametri
di controllo.
Fino ad oggi, con il GF2, il
numero di nodi di controllo era molto basso, adesso invece
nVidia dichiara di poter utilizzare fino a 32 nodi (o "bones"),
un numero molto alto e molto superiore anche a quello disponibile
nel Radeon.
Altre operazioni eseguibili (e
finora appannaggio solo della concorrenza) sono il morphing
dei modelli e il key frame interpolation, entrambe
tecniche di interpolazione tra due modelli geometrici.


Procedural deformation
Con questo termine si indica
la possibilità di applicare una deformazione programmabile
ai vertici di un solido secondo le informazioni contenute
in una texture (Displacement Mapping) o una formula
matematica. Ad esempio è possibile muovere una bandiera
al vento, o creare le dune del deserto, o ancora aggiungere
del dettaglio ai poligoni tramite del rumore frattale.


Altri effetti
Tra
gli altri effetti realizzabili abbiamo il vertex motion
blur che permette di ottenere un buon effetto di motion
blur senza oversampling e quindi molto più velocemente;
è finalmente accelerato completamente in hardware il
bump-mapping dot3 grazie alla possibilità di
eseguire i necessari calcoli geometrici tramite il Vertex
Shader (prima dovevano essere eseguiti dalla cpu). Ed ancora
abbiamo effetti di riflessione e rifrazione,
nebbia stratificata, effetti pelliccia, sistemi
particellari e molto, molto altro.
Un particolare discorso va fatto sull'annunciato ma poco specificato
supporto alle superfici curve; dal comportamento di
nVidia sembra proprio che si tratti di una caratteristica
appena abbozzata per potersi fregiare del titolo di 100% Hardware
acceleration delle nuove funzioni DirectX8.