Pixel shader-fase
De pixel-shader-fase (PS) maakt uitgebreide arceringstechnieken mogelijk, zoals verlichting per pixel en naverwerking. Een pixel-shader is een programma dat constante variabelen, patroongegevens, geïnterpoleerde waarden per hoekpunt en andere gegevens combineert om uitvoer per pixel te produceren. De rasterizerfase roept één keer een pixel-shader aan voor elke pixel die wordt gedekt door een primitieve, maar het is mogelijk om een NULL- shader op te geven om te voorkomen dat een shader wordt uitgevoerd.
De Pixel shader
Wanneer een patroon met meerdereampling wordt aangeroepen, wordt een pixel-shader eenmaal per bedekte pixel aangeroepen terwijl er een diepte-/stenciltest plaatsvindt voor elke gedekte multisample. Voorbeelden die de diepte-/stenciltest doorgeven, worden bijgewerkt met de uitvoerkleur van de pixel-shader.
De intrinsieke functies van de pixel-shader produceren of gebruiken derivaten van hoeveelheden met betrekking tot schermruimte x en y. Het meest voorkomende gebruik voor derivaten is het berekenen van detailberekeningen op het niveau van detail voor patronenampling en in het geval van anisotropische filtering, het selecteren van monsters langs de as van anisotropie. Normaal gesproken voert een hardware-implementatie een pixel-shader uit op meerdere pixels (bijvoorbeeld een 2x2-raster), zodat derivaten van hoeveelheden die zijn berekend in de pixel-shader redelijkerwijs kunnen worden beschouwd als verschillen van de waarden op hetzelfde uitvoeringspunt in aangrenzende pixels.
Ingangen
Wanneer de pijplijn is geconfigureerd zonder geometrie-shader, is een pixel-shader beperkt tot 16, 32-bits, 4-componentinvoer. Anders kan een pixel-shader tot 32, 32-bits, 4-componentinvoer duren.
Pixel-shader-invoergegevens bevatten hoekpuntkenmerken (die kunnen worden geïnterpoleerd met of zonder perspectiefcorrectie) of kunnen worden behandeld als primitieve constanten. Pixel-shader-invoer wordt geïnterpoleerd van de hoekpuntkenmerken van de primitieve die worden gerasterd, op basis van de interpolatiemodus gedeclareerd. Als een primitief wordt geknipt vóór rasterisatie, wordt de interpolatiemodus ook gehonoreerd tijdens het knipproces.
Hoekpuntkenmerken worden geïnterpoleerd (of geëvalueerd) op pixel-shader center-locaties. Interpolatiemodi voor pixel-shaderkenmerken worden gedeclareerd in een invoerregisterdeclaratie, op basis van een per-element in een argument of een invoerstructuur. Kenmerken kunnen lineair worden geïnterpoleerd of met zwaartepuntsampling. De zwaartepuntsevaluatie is alleen relevant tijdens multisampling om gevallen te behandelen waarin een pixel wordt bedekt door een primitieve, maar een pixelcentrum mogelijk niet; centroid-evaluatie vindt zo dicht mogelijk plaats bij het (niet-gedekte) pixelcentrum.
Invoer kan ook worden gedeclareerd met een semantischevan de systeemwaarde, die een parameter markeert die wordt gebruikt door andere pijplijnfasen. Een pixelpositie moet bijvoorbeeld worden gemarkeerd met de SV_Position semantisch. De IA-fase kan één scalaire voor een pixel-shader produceren (met behulp van SV_PrimitiveID); de rasterizerfase kan ook één scalaire voor een pixel-shader genereren (met behulp van SV_IsFrontFace).
Uitgangen
Een pixel-shader kan maximaal 8, 32-bits, 4-componentkleuren of geen kleur uitvoeren als de pixel wordt verwijderd. Pixel shader-uitvoerregisteronderdelen moeten worden gedeclareerd voordat ze kunnen worden gebruikt; elk register is een uniek uitvoer-schrijfmasker toegestaan.
Gebruik de status diepte-write-enable (in de fase uitvoer-fusie) om te bepalen of dieptegegevens naar een dieptebuffer worden geschreven (of gebruik de instructie voor verwijderen om gegevens voor die pixel te verwijderen). Een pixel-shader kan ook een optionele 32-bits, 1-component, drijvende komma, dieptewaarde voor dieptetests uitvoeren (met behulp van de SV_Depth semantisch). De dieptewaarde wordt uitgevoerd in het oDepth-register en vervangt de geïnterpoleerde dieptewaarde voor dieptetests (ervan uitgaande dat dieptetests zijn ingeschakeld). Er is geen manier om dynamisch te veranderen tussen het gebruik van diepte van vaste functies of shader oDepth.
Een pixel-shader kan geen stencilwaarde uitvoeren.
Verwante onderwerpen