Fase pixel shader (PS)
La fase Pixel Shader (PS) riceve i dati interpolati per una primitiva e genera dati per pixel, ad esempio il colore.
Si tratta di una fase programmabile-shader, che viene visualizzata come blocco arrotondato nel diagramma della pipeline grafica. Questa fase dello shader espone la propria funzionalità univoca, basata sul modello di shader 4.0 core common-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 Rasterizer (RS) richiama un pixel shader una volta per ogni pixel coperto da una primitiva, ma è possibile specificare uno shader con valore NULL per evitare di eseguire uno shader.
Quando si esegue il multicampionamento di una texture, un pixel shader viene richiamato una volta per pixel coperto mentre si verifica un test di profondità/stencil per ogni multicampione coperto. I campioni che superano il test profondità/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 nell'eseguire calcoli di livello di dettaglio per il campionamento delle texture 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 è configurata senza uno shader geometrico, 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 a ogni elemento in un argomento o in una struttura di input. Gli attributi possono essere interpolati in modo lineare o con campionamento centroid. Vedere la sezione "Campionamento centroid degli attributi quando si esegue l'antialiasing multisample" nelle Regole di rasterizzazione. 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 esserlo; la valutazione del centroide avviene il più vicino possibile al centro del pixel (non coperto).
Gli input possono anche essere dichiarati con una semantica dei valori 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 Input Assembler (IA) può produrre un valore scalare per un pixel shader (usando SV_PrimitiveID); la fase Rasterizer (RS) può anche generare un valore scalare per un pixel shader (usando SV_IsFrontFace).
Output
Un pixel shader può produrre fino a 8 colori a 32 bit a 4 componenti o nessun colore se il pixel viene scartato. I componenti del registro di output del pixel shader devono essere dichiarati prima di poterli usare; ogni registro è consentito a una maschera distinta per la scrittura di output.
Usare lo stato Abilita-profondità-scrittura (nella fase Output Merger (OM)) 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