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 di rasterizzazione richiama un pixel shader una volta per ogni pixel coperto da una primitiva, ma è possibile specificare uno shader NULL per evitare l'esecuzione di uno shader.
The Pixel Shader
Quando si esegue il multicampionamento di una trama, un pixel shader viene richiamato una volta per pixel coperto mentre viene eseguito un test depth/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.
Input
Quando la pipeline viene configurata senza uno shader geometry, un pixel shader è limitato a 16, input a 32 bit e componenti a 4. 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 a ogni 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 del 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 di rasterizzazione può anche generare un scalare per un pixel shader (usando SV_IsFrontFace).
Output
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 che possano essere usati; 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 sia abilitato il test di profondità). Non è possibile cambiare dinamicamente tra l'uso della profondità a funzione fissa o dell'oDepth dello shader.
Un pixel shader non può restituire un valore di stencil.
Argomenti correlati