Il Pixel Shader è
la seconda parte del' nfiniteFX Engine. Siamo già
nella così detta fase di rasterizzazione. Il Vertex
Shader passa i vertici trasformati e illuminati ad una fase
intermedia che effettua la proiezione sullo schermo e il clipping
(eliminazione dei punti fuori dallo schermo), i parametri
calcolati vengono quindi passati al motore di rasterizzazione
per trasformarli in triangoli texturizzati ed ombreggiati.
Il Pixel Shader rappresenta un'evoluzione
dello Shader Rasterizer presente nel GF2. In pratica
adesso è possibile combinare a piacere una serie di
operazioni e calcoli sulle texture per poter realizzare particolari
effetti grafici.

Il numero massimo di effetti
eseguibili contemporaneamente su ciascun pixel sale a 36 rispetto
ai 7 del GF2. Più in dettaglio il Pixel Shader ha 4
unità programmabili di prelievo dei texture sample;
queste unità prelevano e manipolano il sample secondo
una specifica tecnica programmabile. I 4 filtered sample risultanti
possono essere fusi in un unico pixel tramite una pipeline
programmabile che esegue fino ad 8 operazioni di mixing. All'unico
valore risultante vengono applicati gli effetti di nebbia,
illuminazione e alpha blending.
Abbiamo detto che il Pixel Shader
può gestire 4 filtered sample, in realtà siccome
si possono prelevare dalla memoria solamente 2 sample per
ciclo di clock, l'applicazione di 4 sample può richiedere
fino ad un massimo di 2 colpi di clock.
E' molto importante sottolineare
che questo approccio risulta più veloce sul campo di
quello della GF2. Nella GeForce2, per utilizzare 4 texture
su un solo pixel, dobbiamo realizzare 2 passate da 1 colpo
di clock, ciascuna passata esegue il rendering di un pixel
con 2 texture ed alla fine si sommano i risultati. Nel GF3
si realizza una sola passata lunga fino a 2 clock, la differenza
è una maggiore ottimizzazione nell'accesso alla memoria,
infatti tra le altre cose, non è detto che tutte e
4 le unità di sampling debbano prelevare dati dalla
memoria nello stesso ciclo di clock perchè ciò
dipende dalle grandezze relative delle texture applicate e
dal livello di mip-mapping. Complessivamente questa tecnica
permette una minore richiesta di banda quando si usano 3 o
4 texture per pixel.
Un'altra
importante caratteristica del Pixel Shader è la possibilità
di pilotare le operazioni da questo eseguite in funzione dei
risultati del Vertex Shader, questa è a detta dei programmatori
esperti la caratteristica più interessante e permette
ad esempio un'accelerazione completamente hardware del bump-mapping
dot3 (una tecnica evoluta di bump-mapping che garantisce
la massima qualità).
Complessivamente i vari punti
dove è possibile intervenire eseguendo delle istruzioni
sono 12 (4 nelle fasi di sample fetch, 8 nella fase
di mixing dei sample). Le istruzioni eseguibili nella
fasi di fetch delle texture possono essere scelte tra 13 disponibili.
Queste istruzioni rappresentano elaborazioni di alto livello
come: prelevo e filtraggio di una texture, esecuzione dell'effetto
di bump mapping secondo varie tecniche, operazioni vettoriali
e altro ancora. Le operazioni tra cui segliere per le elaborazioni
eseguite nella pipeline di mixing sono in totale 8: somme,
sottrazioni, medie pesate, accumuli ed altre operazioni da
effettuarsi sui valori RGB e Z del pixel.
Con queste funzionalità programmabili è possibile
realizzare vari effetti tra cui:
Convoluzione di immagini
Mapping con anisotropic filtering (32 sample) con texture
fino a 4096x4096
Texture volumetriche fino a 512x512x512
Texture video YUYV
Modelli di illuminazione evoluti (BRDF)
True Reflective Bump Mapping
Tra le funzionalità particolari supportate dal Pixel
Shader va senza dubbio analizzata più a fondo la possibilità
di calcolare le ombre portate tramite l'impiego di Shadow
Map.
Shadow Map
Una tecnica molto usata nella
Computer Graphic per il calcolo delle ombre portate (ossia
le ombre comunemente intese) è quella chiamata Shadow
Map.
Questo
algoritmo consiste nel calcolare la scena dal punto di vista
della luce;in particolare quello che a noi interessa sono
i valori dello Z-buffer generati in questo tipo di rendering.
Infatti questi valori indicano quanto in profondità
nella scena penetrano i raggi della luce prima di trovare
un'ostacolo. Trovati questi valori (che formano la Shadow
Map vera e propria) si va a calcolare la scena dal punto
di vista dell'osservatore. Se adesso, prima di ombreggiare
i pixel si effettua una trasformazione del punto che stiamo
renderizzando nello spazio della Shadow Map, è possibile
confrontare lo z-value del pixel con quello contenuto nella
mappa e determinare se la luce arriva o meno su quel punto.
Questa funzionalità è
estremamente importante per dare realismo ad una scena e sarà
una delle tecnologie più perfezionate e potenziate
nel futuro. Per adesso non c'e' dato sapere molto sulle reali
prestazioni del GF3 con questa funzionalità attivata,
nè quante Shadow Map contemporanee riesca a
gestire il Pixel Shader.