|
Come i modelli della serie 6800, la famiglia
6600 supporta i Vertex ed i Pixel Shaders in versione 3.0,
introdotti dal rilascio delle DirectX 9.0c. Sostanzialmente il passaggio
dalla versione 2.0 alla versione 3.0 permette di scrivere programmi di
shader più lunghi, migliorandone l'efficienza ed aumentandone la
complessità. E' opportuno fare una differenziazione tra Vertex Shaders
2.0 (introdotti da poco più di un anno) e 3.0.
| Vertex Shaders 2.0
vs. Vertex Shaders 3.0 |
| Vertex shader
feature |
Shader 2.0 |
Shader 3.0 |
Descrizione |
|
Lunghezza dello Shader |
256 istruzioni |
65535
istruzioni |
Più istruzioni permettono una
illuminazione dei soggetti maggiormente dettagliata, idem per
l'animazione |
|
Dynamic branching |
No |
Yes |
Migliora le performances perchè il calcolo
di vertici irrilevanti e di animazioni irrilevanti viene evitato |
|
Vertex texture |
No |
Fino ad un max di 4 textures |
Permette il displacement mapping ed
effetti di particella |
|
Instancing support |
No |
Richiesta |
Permette il disegno di più oggetti tramite
un singolo comando |
| Registri Temporanei |
12 |
32 |
|
| Static Flow Control |
Si |
Si |
|
| Dinamic Flow Control |
No |
Si |
|
| Profondità del controllo di flusso dinamico |
No |
24 stadi |
|
L'instancing è forse una delle funzioni più importanti dei VS3.0:
essa permette infatti di rimuovere il sovraccarico sulla GPU dato da
molteplici istanze (oggetti) basati sullo stesso modello tridimensionale.
Attualmente ogni modello in una scena 3D necessita di una fase di setup,
e dell'invio alla GPU per il rendering. In questo modo invece è
possibile creare tutti gli oggetti che si desidera di un modello
partendo semplicemente da un flusso di vertici: le istanze (oggetti)
potranno essere manipolate dal Vertex Shader per darle caratteristica
una per una.
Attualmente i giochi mostrano un importante limite nel numero di
oggetti che essi possono visualizzare in una scena 3D a causa del carico
sulla CPU di sistema nel gestire e memorizzare oggetti che spesso
possono differire di poco. Un esempio calzante è rappresentato da una
foresta fatta di alberi che sono simili fra loro ma ognuno di essi può
avere caratteristiche differenti come altezza, colore delle foglie e del
tronco, larghezza della chioma, posizione e così via. Prima della
versione 3.0 degli Shader Model, gli sviluppatori che volevano avere
tanti alberi dalle differenti caratteristiche, dovevano scegliere se
memorizzare diverse copie degli alberi ognuna con piccole differenze
dall'altra oppure se effettuare operazioni di rendering molto pesanti
per scalare, ruotare, colorare, etc.
Grazie alla possibilità di creare istanze degli alberi, lo
sviluppatore può creare un albero fatto di un certo numero di vertici e
poi creare un array di dati per specificare le caratteristiche di
altezza, colore, ampiezza della chioma, etc. In questo modo la
generazione di 100 alberi per la foresta richiede i soli 100 dati
caratterizzanti ogni istanza di un albero, il modello dell'albero stesso
(dunque i suoi vertici) ed una sola chiamata per disegnare l'intera
foresta.
Mostriamo le differenze tra le due revisioni di Pixel Shader: 2.0 e
3.0
| Pixel Shaders 2.0
vs. Pixel Shaders 3.0 |
|
Pixel shader feature |
Shader 2.0 |
Shader 3.0 |
Descrizione |
|
Lunghezza dello Shader |
96 |
65535+ |
Permette una illuminazione più complessa,
shading e processo dei materiali |
|
Dynamic branching |
No |
Si |
Permette di alleggerire il carico di
lavoro saltando il calcolo di operazioni di Shading complesse su
Pixels irrilevanti. |
|
Shader anti-aliasing |
No |
Integrato |
Gli sviluppatori possono calcolare lo
spazio su schermo derivato da qualsiasi funzione, permettendogli
di variare le frequenze di Shading o di Oversampling, per
eliminare artefatti |
|
Back-face register |
No |
Si |
Garantisce l'illuminazione su due lati per
singola passata |
|
Interpolated color format |
8-bit integer minimo |
32-bit floating point minimo |
Una maggior ampiezza e precisione dei
colori permette una alta dinamica d'illuminazione a livello di
vertici |
|
Multiple render targets |
Opzionale |
4 richiesti |
Garantisce algoritmi di illuminazione
avanzati per diminuire il carico di lavoro sul filtraggio e sui
vertici (più luci a fronte di una minima spesa di prestazioni) |
|
Fog and specular |
8-bit a funzione fissa |
Custom fp16-fp32 shader program |
Il modello 3.0 degli Shader garantisce
allo sviluppatore un pieno e preciso controllo per quanto
riguarda il calcolo della nebbia e della specularità, prima
funzioni fisse |
|
Texture coordinate count |
8 |
10 |
Più informazioni per pixels garantiscono
un rendering più realistico, specialmente per la pelle |
Altra grossa innovazione degli Shader 3.0 (sia per vertex shaders
che pixel shaders) è la funzione chiamata Dynamic Branching.
Semplicemente, questa funzione permette al programmatore dello shader, di creare un
vero ciclo e condizioni nel programma di shading. Per esempio, uno può
scrivere uno shader che fa un loop di un certo numero di luci sui
vertici, e poi passare l'indice di ogni luce rilevante all'unità di
pixel shader. Il pixel shader può usare questo indice di luci per
determinare il parametro da applicare, per poi tornare in loop sulle
luci attive, ed usare il Dynamic Branching per uscire dallo shader
stesso prima che tutte le luci siano ancora processate.
La combinazione Vertex e Pixel Branching permette di saltare l'elaborazione
di luci che lo shader individua come non soggette alla sorgete di luce.
Questo garantisce un minor carico di lavoro, oltre ad accelerare lo
Shader.
|