Dela via


Pixelskuggningssteg

Pixelskuggningssteget (PS) möjliggör omfattande skuggningstekniker som belysning per bildpunkt och efterbearbetning. En pixelskuggning är ett program som kombinerar konstanta variabler, texturdata, interpolerade värden per hörn och andra data för att producera utdata per bildpunkt. Rastreringssteget anropar en pixelskuggning en gång för varje pixel som omfattas av en primitiv, men det är möjligt att ange en NULL- skuggning för att undvika att köra en skuggning.

Pixelskuggaren

Vid multisampling av en struktur anropas en pixelskuggare en gång per täckt pixel medan ett djup-/stenciltest utförs för varje täckt multisample. Exempel som klarar djup-/stenciltestet uppdateras med pixelskuggningsfärgen.

Pixelskuggningens inbyggda funktioner producerar eller använder derivat av kvantiteter med avseende på skärmutrymme x och y. Den vanligaste användningen för derivat är att beräkna detaljnivåberäkningar för textursampling och vid anisotrop filtrering genom att välja prover längs anisotropiaxeln. Vanligtvis kör en maskinvaruimplementering en pixelskuggare på flera bildpunkter (till exempel ett 2x2-rutnät) samtidigt, så att derivat av kvantiteter som beräknas i pixelskuggningen rimligen kan approximeras som deltan av värdena vid samma körningspunkt i intilliggande bildpunkter.

Ingångar

När pipelinen konfigureras utan en geometriskuggning begränsas en pixelskuggning till 16, 32-bitars, 4-komponentsindata. Annars kan en pixelskuggning ta upp till 32, 32-bitars, 4-komponentsindata.

Pixel shader-indata innehåller hörnattribut (som kan interpoleras med eller utan perspektivkorrigering) eller kan behandlas som per primitiva konstanter. Pixelskuggningsindata interpoleras från hörnattributen för den primitiva som rastreras, baserat på det deklarerade interpoleringsläget. Om en primitiv klipps ut före rastreringen respekteras även interpoleringsläget under urklippsprocessen.

Hörnattribut interpoleras (eller utvärderas) på platser i pixelskuggningscentret. Interpoleringslägen för pixelskuggattribut deklareras i en indataregisterdeklaration per element i antingen ett argument eller en indatastruktur. Attribut kan interpoleras linjärt eller med centroidsampling. Centroidutvärdering är endast relevant under multisampling för att täcka fall där en pixel täcks av en primitiv men en pixel mittpunkt kanske inte är; centroid utvärdering sker så nära (icke-täckt) pixelcentret som möjligt.

Indata kan också deklareras med en semantisk, som markerar en parameter som förbrukas av andra pipelinesteg. Till exempel ska en pixelposition markeras med SV_Position semantisk. IA-fasen kan skapa en skalär för en pixelskuggning (med hjälp av SV_PrimitiveID); Rastreringssteget kan också generera en skalär för en pixelskuggning (med hjälp av SV_IsFrontFace).

Utgångar

En pixelskuggning kan mata ut upp till 8, 32-bitars, 4-komponentsfärger eller ingen färg om pixeln tas bort. Pixel shader-utdataregisterkomponenter måste deklareras innan de kan användas. varje register tillåts en distinkt utdataskrivningsmask.

Använd tillståndet depth-write-enable (i utdatasammanslagningsfasen) för att kontrollera om djupdata skrivs till en djupbuffert (eller använda instruktionen ignorera för att ta bort data för den pixeln). En pixelskuggare kan också mata ut ett valfritt 32-bitars, 1-komponents, flyttal, djupvärde för djuptestning (med hjälp av SV_Depth semantisk). Djupvärdet är utdata i oDepth-registret och ersätter det interpolerade djupvärdet för djuptestning (förutsatt att djuptestning är aktiverat). Det finns inget sätt att dynamiskt ändra mellan att använda djup med fast funktion eller skuggning oDepth.

En pixelskuggning kan inte mata ut ett stencilvärde.

Grafikpipeline

pipelinesteg (Direct3D 10)