Fase pixel shader
La fase pixel shader (PS) consente tecniche di ombreggiatura avanzate, ad esempio l'illuminazione per pixel e la post-elaborazione. Un pixel shader è un programma che combina variabili costanti, dati di trama, valori interpolati per vertice e altri dati per produrre output per pixel. La fase del rasterizzatore richiama un pixel shader una volta per ogni pixel coperto da una primitiva, ma è possibile specificare un NULL shader per evitare di eseguire uno shader.
The Pixel Shader
Quando si esegue il multicampionamento di una trama, un pixel shader viene richiamato una volta per pixel coperto mentre si verifica un test di profondità/stencil per ogni multisample coperta. I campioni che superano il test depth/stencil vengono aggiornati con il colore di output del pixel shader.
Le funzioni intrinseche pixel shader producono o usano derivati di quantità rispetto allo spazio dello schermo x e y. L'uso più comune per i derivati consiste nel calcolare calcoli di livello di dettaglio per il campionamento delle trame e nel caso del filtro anisotropico, selezionando campioni lungo l'asse dell'anisotropia. In genere, un'implementazione hardware esegue un pixel shader su più pixel (ad esempio una griglia 2x2) contemporaneamente, in modo che i derivati delle quantità calcolate nel pixel shader possano essere ragionevolmente approssimativi come delta dei valori allo stesso punto di esecuzione in pixel adiacenti.
Ingressi
Quando la pipeline è configurata senza uno shader geometry, un pixel shader è limitato a 16 input a 32 bit e a 4 componenti. In caso contrario, un pixel shader può richiedere fino a 32 input a 32 bit e a 4 componenti.
I dati di input del pixel shader includono attributi dei vertici (che possono essere interpolati con o senza correzione prospettica) o possono essere considerati come costanti per primitiva. Gli input del pixel shader vengono interpolati dagli attributi dei vertici della primitiva da rasterizzare, in base alla modalità di interpolazione dichiarata. Se una primitiva viene ritagliata prima della rasterizzazione, la modalità di interpolazione viene rispettata anche durante il processo di ritaglio.
Gli attributi dei vertici vengono interpolati (o valutati) in posizioni del centro pixel shader. Le modalità di interpolazione degli attributi pixel shader vengono dichiarate in una dichiarazione del registro di input, in base all'elemento in un argomento o in una struttura di input . Gli attributi possono essere interpolati in modo lineare o con campionamento centroide. La valutazione centroide è rilevante solo durante il multicampionamento per coprire i casi in cui un pixel è coperto da una primitiva, ma un centro pixel potrebbe non essere; la valutazione centroide si verifica il più vicino possibile al centro pixel (non coperto).
Gli input possono anche essere dichiarati con una semantica valore di sistema, che contrassegna un parametro utilizzato da altre fasi della pipeline. Ad esempio, una posizione in pixel deve essere contrassegnata con la semantica SV_Position. La fase IA può produrre un scalare per un pixel shader (usando SV_PrimitiveID); la fase del rasterizzatore può anche generare un scalare per un pixel shader (usando SV_IsFrontFace).
Uscite
Un pixel shader può restituire fino a 8, 32 bit, colori a 4 componenti o nessun colore se il pixel viene rimosso. I componenti del registro di output del pixel shader devono essere dichiarati prima di poterli usare; ogni registro è consentito a una maschera di scrittura di output distinta.
Usare lo stato depth-write-enable (nella fase di unione dell'output) per controllare se i dati di profondità vengono scritti in un buffer di profondità (o usare l'istruzione discard per eliminare i dati per tale pixel). Un pixel shader può anche restituire un valore facoltativo a 32 bit, a 1 componente, a virgola mobile e profondità per il test di profondità (usando la semantica SV_Depth). Il valore di profondità viene restituito nel registro oDepth e sostituisce il valore di profondità interpolato per il test di profondità (presupponendo che il test di profondità sia abilitato). Non è possibile passare dinamicamente dall'uso della profondità a funzione fissa o dell'oDepth dello shader.
Un pixel shader non può restituire un valore di stencil.
Argomenti correlati
-
fasi della pipeline (Direct3D 10)