Presentazione
I Vertex Shaders, rappresentano forse la novità più consistente e più foriera di conseguenze tra quelle introdotte recentemente con le DirectX 8 di Microsoft. In questa API, è stata "creata" la possibilità di utilizzare dei specifici "programmi" di calcolo, che modificano i vertici dei triangoli che compongono gli oggetti in una scena 3D, agendo "direttamente" sulle variabili ad essi associate. La struttura di questi programmi, originariamente sviluppata da nVidia per l'openGL (NV_Vertex_Program), utilizza un set proprietario di comandi dedicati al solo 3D, ottimizzato per poter svolgere operazioni complesse con poche istruzioni che permette di velocizzare lo svolgimento di calcoli altrimenti estremamente onerosi in termini di tempo. La novità non si riduce però solo all'efficenza del "linguaggio", che già adesso consente di gestire in software situazioni geometriche molto complesse (come per esempio il test "Vertex Shaders" di 3DMark 2001), con una scioltezza sorprendente. La verà novità, consiste nel fatto che il nuovo Direct3DX, oltre ad utilizzare dei Vertex Shaders predefiniti contenuti nelle DirectX 8, è strutturato in modo da accettare dei Vertex shaders "esterni", scritti dagli stessi sviluppatori dei giochi, e che questi, dall'interno dell'applicazione, possono "comandare" direttamente un hardware appositamente strutturato, passando per l'API di Microsoft in modo "trasparente", diminuendo così drasticamente i livelli di astrazione tra l'applicazione e l'hardware (Pure HAL). La caratteristica più innovativa di questi Vertex Shaders è dunque la "programmabilità" consentita agli sviluppatori, i quali, invece di dover modellare il loro software solo sulle funzioni supportate dall'API, adesso hanno la più ampia possibilità non solo di gestire essi stessi queste funzioni, ma, anche di creare effetti speciali nuovi ed estremamente più complessi di prima, grazie all'uso di un hardware appositamente predisposto.
Il GeForce3 di nVidia, introduce per primo un engine specifico per il calcolo dei Vertex Shaders programmabili in hardware. Dalla lettura più attenta del documento tecnico di presentazione di nVidia, la cui traduzione segue questa introduzione, emergono dei particolari molto interessanti.
Innanzitutto, almeno per quanto riguarda le DirectX 8, Il vertex processor dell'nFinite FX engine del GeForce3, risulta essere "alternativo" all'engine di Trasform & Lighting sempre presente nello stesso chip. Infatti, il primo è in grado di svolgere tutte le funzioni di calcolo del secondo, a patto di usare un software specifico che lo utilizzi (i Vertex Shaders programmabili, appunto), mentre il secondo invece si appoggia sulle specifiche delle DirectX7, che non supportano ufficialmente i Vertex Shader. La presenza di entrambi quindi, e' giustificata per la piena compatibilità con il software esistente. La cosa potrebbe risultare strana, dal momento che in realtà verrebbe spontaneo pensare al vertex processor come ad una vera e propria "estensione" del engine di T/L. Ma, questa "scelta", dà forse la misura di quanto abbia influito nell'impostazione progettuale del nFiniteFX Engine la rivoluzione che stà per arrivare con l'XboX, quanto esso e le DirectX 8 costituiscano un taglio netto col passato, e, quanto questo "momento" sia ormai prossimo. E in questo contesto, potremmo già fare una considerazione interessante circa l'Xchip. Poiche' questo chip grafico nascerà esclusivamente per far girare applicazioni ottimizzate solo per DirectX 8 e seguenti, allora non dovrebbe più avere presente al suo interno il tradizionale motore di Trasform & Lighting, lasciando quindi "libero" dello spazio, che potrebbe essere usato in altro modo, per esempio, come si vocifera da un po' di tempo sulla rete, per un deciso "potenziamento" del Vertex Processor.
La seconda cosa molto interessante nella lettura del documento, e' l'estrema "potenza" dei Vertex Shader programmabili, accoppiati ad un hardware dedicato. Un Vertex Shaders che agisca su un hardware progettato appositamente per eseguirlo, oltre a rendere disponibili una vasta gamma di effetti grafici altrimenti non ottenibili se non con grande dispendio di risorse, rende possibile adesso non solo la piu' ampia possibilità di programmazione dei registri hardware, ma anche la ri-configurabilità in real-time delle sue istruzioni, in pratica, consentendo di ottenere sia un aumento di efficenza, sia una maggiore potenzialità di calcolo, capace di supportare effetti in "peso" ed in "numero" molto elevato, in una misura che mai si era vista su un computer domestico e in tempo reale. L'uso appropriato dei Vertex Shader programmabili in hardware, dovrebbe quindi anche diminuire di parecchio la differenza tra il numero di poligoni/secondo massimi teorici raggiungibili, e quello ottenibile con tutti gli effetti attivati, in funzione della "bravura" del programmatore; una differenza, che sembra invece obbligatoriamente marcata con le unità di Trasform & Lighting attuali, ed il software attuale.
In conclusione, le prospettive date dall'introduzione di questa nuova feature nel mondo della grafica PC, sono molto promettenti e ampie. Oltre alla vasta gamma di effetti grafici ottenibili e gestibili in real-time, con questa novità, si avrà anche un deciso aumento dell'efficenza dello sfruttamento delle risorse a disposizione, a conferma della filosofia che accompagna l'introduzione del nuovo chip di casa nVidia. Per chi volesse sapere di più sui Vertex Shader, può leggersi anche questo articolo. Vi lascio alla traduzione del documento tecnico ufficiale NVIDIA nFiniteFX™ Engine Programmable Vertex Shaders. Il documento originale in inglese di NVIDIA, lo potete trovare qui.
L'NVIDIA ® nFinite-FX™ Engine
L'NVIDIA nfinite-FX engine consente agli sviluppatori la possibilità di programmare un numero infinito di effetti speciali e di visuali customizzate. Invece di dover scegliere obbligatoriamente nell'ambito di effetti consentiti da una rigida palette codificata, per giungere infine ad un risultato finale che mostra il medesimo aspetto e le stesse sensazioni visive per tutti, gli sviluppatori possono in questo modo specificare combinazioni personalizzate per le operazioni grafiche e creare ognuno i propri effetti visivi customizzati. I giochi e le altre applicazioni intensive di grafica saranno in questo modo differenziate ed offriranno effetti visivi più eccitanti e personalizzati. La programmabilità dell'nFiniteFX engine e la moltitudine di effetti che esso consente sono resi possibili da due novita di architettura progettuale brevettate: i Vertex shaders ed i Pixel Shaders. Questo documento tratterà dei vertex shaders programmabili di questo engine.
I Vertex Shaders programmabili:
La nuova Generatione del Geometry Processing
L'avanzamento delle tecnologie nel processamento grafico continua a fornire all'utente finale una grafica 3D in tempo reale sempre più realistica e dettagliata. Con l'introduzione del rivoluzionario nfiniteFX engine di NVIDIA, vengono resi (pienamente) disponibili alla comunità grafica i Vertex ed i Pixel shaders. I Vertex Shaders programmabili sono il primo esempio di una nuova funzionalità nelle unità di processamento grafico (GPU), che abilita una palette di effetti visivi real-time virtualmente infinita. Poichè richiedono calcoli molto complessi, è stato possibile ottenere questi effetti in precedenza solamente grazie alla renderizzazione "offline", ed utilizzando delle stazioni grafiche. L'aggiunta dei Vertex Shaders programmabili ai processori grafici consumer, conduce la grafica per PC ad un livello sbalorditivo.
Cosa è un Vertex Shader?
Un Vertex shaders è una funzione del processamento grafico che aggiunge effetti visivi speciali agli oggetti in una scena grafica tridimensionale. Un Vertex shader programmabile consente agli sviluppatori di mettere a punto degli effetti grazie al caricamento di nuove sofisticate istruzioni nella Vertex Shader memory. I Vertex shaders compiono delle operazioni matematiche sui dati dei vertici degli oggetti. Ciascun vertice è definito da una certa quantità di variabili. Nel caso più semplice, a ciascun vertice sono associate delle coordinate X, Y, Z che definiscono la sua posizione spaziale. Un vertice può inoltre includere dei dati che riguardano il colore, l'alpha-channel, texture, e le caratteristiche dell'illuminazione che agisce su di esso come il colore speculare. Guardate la Figura 1 per un esempio visivo di un vertice e qualcuno dei dati ad esso associati.
Figura 1: dati associati ad un vertice di un triangolo
NDT: ad ogni vertice di un triangolo sono associati dei valori, che vanno dalle coordinate spaziali, al suo colore di base, alle textures, ai dati che serviranno per calcolarne l'illuminazione; coi VS programmabili, è ora possibile inserire nei registri hardware direttamente tutti questi dati, e senza una gerarchia specifica; ciò consentirà, per esempio, il calcolo agevolato delle "normali" ai vertici, che definiscono esattamente la direzione e l'intensità dell'illuminazione che agisce su di esso: e questo, unito alla interpolazione lineare delle normali, invece che dei singoli dati colore nella fase di Triangle Setup, faciliterà grandemente il calcolo del "Phong Shading", ovvero del Per-Pixel Lighting
Un Vertex Shader può essere considerato come una scatola magica - i dati dei vertici entrano nella scatola e ne vengono fuori dati di vertici differenti. Ogni singolo dato di vertice che entra, poi esce fuori, ma esso potrebbe essere stato modificato mentre era nella scatola dei Vertex Shaders. I Vertex shaders non creano nè eliminano vertici, ma, semplicemente compiono operazioni su di essi, e cambiano i valori dei dati che descrivono ciascun vertice. Il vertice che ne risulta, può avere una differente posizione nello spazio, un colore differente, può essere più o meno trasparente rispetto a prima, oppure ritrovarsi ad avere differenti coordinate di colore. Tutti questi cambiamenti sui valori dei vertici, svolti tutti insieme su ciascun vertice allo stesso tempo, creano l'effetto speciale per l'intero oggetto. Uno specifico vertice potrebbe non dover essere modificato nel momento che passa sotto il filtro del Vertex Shader. Un Vertex Shader può essere programmato per modificare solo i vertici che hanno certe caratteristiche oppure può essere programmato per modificare ogni singolo vertice allo stesso modo. I programmatori hanno la flessibilità di poter usare un Vertex Shader in un modo univoco su di un unico oggetto (creando un singolo effetto) e quindi, riprogrammare il medesimo Vertex Shader per applicare un effetto completamente diverso sull'oggetto successivo. (vedi la Figura 2). questa programmabilità sarà analizzata dettagliatamente più avanti in questo documento.
Figura 2: Un vertex Shader Programmabile
NDT: la programmabilità del Vertex Shader, consiste non solo nella possibilità di poter immettere un certo numero di dati, e tramite il programma modificarli tutti insieme nei modi più disparati possibili; consiste anche nella ri-configurabilità del VS stesso, il quale può cambiare completamente effetto applicato da un ciclo di vertici calcolati, all'altro.