Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
De motivatie voor VRS
Vanwege prestatiebeperkingen kan een grafische renderer zich niet altijd veroorloven om hetzelfde kwaliteitsniveau te leveren aan elk deel van de uitvoerafbeelding. Arcering met variabele snelheid ( of grove pixelarcering) is een mechanisme waarmee u renderingprestaties/energie kunt toewijzen tegen frequenties die variëren in uw gerenderde afbeelding.
In sommige gevallen kan de arceringssnelheid worden verminderd met weinig of geen vermindering van de waarneembare uitvoerkwaliteit; leidt tot een prestatieverbetering die in wezen gratis is.
Zonder VRS- multi-sample anti-aliasing met supersampling
Zonder arcering met variabele frequentie is het enige middel om de arceringsfrequentie te beheren met multi-sample antialiasing (MSAA) met uitvoering op basis van een steekproef (ook wel supersampling genoemd).
MSAA is een mechanisme voor het verminderen van geometrische aliassen en het verbeteren van de renderingkwaliteit van een afbeelding in vergelijking met het gebruik van MSAA. Het aantal MSAA-steekproeven, dat 1x, 2x, 4x, 8x of 16x kan zijn, bepaalt het aantal steekproeven dat per doel pixel is toegewezen. Het aantal MSAA-voorbeelden moet vooraf bekend zijn wanneer het doel wordt toegewezen en kan daarna niet meer worden gewijzigd.
Supersampling zorgt ervoor dat de pixel-shader eenmaal per steekproef wordt aangeroepen, met een hogere kwaliteit, maar ook hogere prestatiekosten in vergelijking met uitvoering per pixel.
Uw toepassing kan de arceringssnelheid beheren door te kiezen tussen uitvoering per pixel of MSAA-met-supersampling. Deze twee opties bieden geen goede controle. Mogelijk wilt u ook een lagere arceringssnelheid voor een bepaalde klasse objecten vergeleken met de rest van de afbeelding. Dergelijke objecten kunnen een object bevatten achter een HUD-element, of een transparantie, een vervaging (diepte-van-veld, beweging, enzovoort) of een optische vervorming als gevolg van VR-optiek. Maar dat zou niet mogelijk zijn, omdat de arceringskwaliteit en -kosten voor de hele installatiekopieën worden vastgesteld.
Met arcering met variabele snelheid (VRS)
Het VRS-model (variable-rate arcering) breidt supersampling-with-MSAA uit in de tegenovergestelde richting, 'grof pixel', door het concept van grof arcering toe te voegen. Dit is waar arcering met een frequentie meer grof kan worden uitgevoerd dan een pixel. Met andere woorden, een groep pixels kan worden gearceerd als één eenheid en het resultaat wordt vervolgens uitgezonden naar alle voorbeelden in de groep.
Met een grof arcerings-API kan uw toepassing het aantal pixels opgeven dat deel uitmaakt van een gearceerde groep of grof pixel. U kunt de grootte van de grove pixel variëren nadat u het renderdoel hebt toegewezen. Verschillende gedeelten van het scherm of verschillende tekenpassen kunnen dus verschillende arceringssnelheden hebben.
Hier volgt een tabel waarin wordt beschreven welk MSAA-niveau wordt ondersteund met een grof pixelformaat voor platforms die grof arcering ondersteunen:
- Voor cellen die als Y-zijn gemarkeerd, is die combinatie ingeschakeld.
- Voor cellen die zijn gemarkeerd als Cap, wordt deze combinatie voorwaardelijk ingeschakeld op basis van een cap (AdditionalShadingRatesSupported).
- Voor cellen die leeg zijn, wordt deze combinatie niet ondersteund.
- Voor cellen die halfton-gearceerd zijn, wordt deze combinatie niet ondersteund, en het gaat om het bijhouden van meer dan 16 steekproeven per pixel-shader-aanroep. Voor het bijhouden van meer dan 16 steekproeven zijn er extra hardwareuitlijningsbarrières ter ondersteuning in vergelijking met de andere gevallen.
Functielagen
Er zijn twee lagen voor de VRS-implementatie en twee mogelijkheden waarvoor u query's kunt uitvoeren. Elke laag wordt uitgebreider beschreven na de tabel.
Laag 1
- Arceringssnelheid kan alleen per teken worden opgegeven; niet gedetailleerder dan dat.
- Arceringssnelheid is uniform van toepassing op wat onafhankelijk van waar deze zich in het renderdoel bevindt.
Laag 2
- Arceringssnelheid kan per teken worden opgegeven, zoals in laag 1. Het kan ook worden opgegeven door een combinatie van per tekenbasis en van:
- Semantisch van elk provocerend hoekpunt, en
- een schermruimteafbeelding.
- Arceringssnelheden van de drie bronnen worden gecombineerd met behulp van een set combinaties.
- Tegelgrootte schermruimte is 16x16 of kleiner.
- De arceringssnelheid die door uw toepassing wordt aangevraagd, wordt gegarandeerd exact geleverd (voor precisie van tijdelijke en andere reconstructiefilters).
- SV_ShadingRate PS-invoer wordt ondersteund.
- De per-provocerende hoekpunt (ook wel bekend als per-primitieve) arceringssnelheid, is geldig wanneer één viewport wordt gebruikt en
SV_ViewportArrayIndexniet naar wordt geschreven. - De per-provoking-hoekpuntsnelheid kan worden gebruikt met meer dan één viewport als de SupportsPerVertexShadingRateWithMultipleViewports mogelijkheid is ingesteld op
true. In dat geval kan dat tarief ook worden gebruikt wanneerSV_ViewportArrayIndexnaar wordt geschreven.
Lijst met mogelijkheden
-
AdditionalShadingRatesSupported
- Booleaanse waarde.
- Geeft aan of 2x4, 4x2 en 4x4 grove pixelgrootten worden ondersteund voor rendering met één steekproef; en of grof pixelformaat 2x4 wordt ondersteund voor 2x MSAA.
-
SupportsPerVertexShadingRateWithMultipleViewports
- Booleaanse waarde.
- Geeft aan of meer dan één viewport kan worden gebruikt met de arceringssnelheid per hoekpunt (ook wel per primitief genoemd).
Arceringssnelheid opgeven
Voor flexibiliteit in toepassingen zijn er verschillende mechanismen beschikbaar om de arceringssnelheid te beheren. Er zijn verschillende mechanismen beschikbaar, afhankelijk van de hardwarefunctielaag.
Opdrachtlijst
Dit is het eenvoudigste mechanisme voor het instellen van de arceringssnelheid. Deze is beschikbaar op alle lagen.
Uw toepassing kan een grove pixelgrootte opgeven met behulp van de methode ID3D12GraphicsCommandList5::RSSetShadingRate methode. Deze API heeft één opsommingsargument nodig. De API biedt een algemene controle over het kwaliteitsniveau voor rendering: de mogelijkheid om de arceringssnelheid per teken in te stellen.
Waarden voor deze status worden uitgedrukt via de opsomming D3D12_SHADING_RATE.
Ondersteuning voor grof pixelformaat
De arceringstarieven 1x1, 1x2, 2x1 en 2x2 worden ondersteund voor alle lagen.
Er is een mogelijkheid, AdditionalShadingRatesSupported, om aan te geven of 2x4, 4x2 en 4x4 worden ondersteund op het apparaat.
Schermruimteafbeelding (op basis van afbeelding)
Op laag 2 en hoger kunt u de pixelarceringssnelheid opgeven met een schermruimteafbeelding.
Met de afbeelding van de schermruimte kan uw toepassing een lod-masker (level-of-detail) maken dat regio's van verschillende kwaliteit aangeeft, zoals gebieden die worden gedekt door bewegingsvervaging, diepte-van-veldvervaging, transparante objecten of HUD UI-elementen. De resolutie van de afbeelding bevindt zich in macroblokkeringen; deze staat niet in de resolutie van het renderdoel. Met andere woorden, de arceringsfrequentiegegevens worden opgegeven met een granulariteit van tegels van 8x8 of 16x16 pixel, zoals aangegeven door de grootte van de VRS-tegel.
Tegelgrootte
Uw toepassing kan een query uitvoeren op een API om de ondersteunde VRS-tegelgrootte voor het apparaat op te halen.
Tegels zijn vierkant en de grootte verwijst naar de breedte of hoogte van de tegel in Texels.
Als de hardware geen arcering op laag 2-variabele frequentie ondersteunt, retourneert de mogelijkheidsquery voor de tegelgrootte 0.
Als de hardware-wel ondersteuning biedt voor laag 2 variabele arcering, is de tegelgrootte een van deze waarden.
- 8
- 16
- 32
Grootte van schermruimteafbeelding
Voor een renderdoel van grootte {rtWidth, rtHeight}, met behulp van een bepaalde tegelgrootte met de naam VRSTileSize, is de schermruimteafbeelding die deze van deze dimensies bedekt.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
De schermruimteafbeelding linksboven (0, 0) is vergrendeld aan de linkerbovenhoek van het render-doel (0, 0).
Als u de coördinaat (x,y) wilt opzoeken van een tegel die overeenkomt met een bepaalde locatie in het renderdoel, verdeelt u de coördinaten van de vensterruimte (x, y) door de tegelgrootte, waarbij fractionele bits worden genegeerd.
Als de afbeelding van de schermruimte groter is dan voor een bepaald renderdoel, worden de extra gedeelten aan de rechterkant en/of onderkant niet gebruikt.
Als de schermruimteafbeelding te klein is voor een bepaald renderdoel, levert een poging tot lezen uit de afbeelding buiten de werkelijke mate een standaard arceringsfrequentie van 1x1 op. Dit komt doordat de afbeelding linksboven (0, 0) van de schermruimte linksboven (0, 0) is vergrendeld voor het render-doel (0, 0) en 'lezen buiten de render-doelbereiken': het lezen van te grote waarden voor x en y.
Indeling, indeling, resource-eigenschappen
De indeling van dit oppervlak is een 8-bits 8-bits oppervlak (DXGI_FORMAT_R8_UINT).
De resource is dimensie TEXTURE2D.
Het kan niet worden gematrixd of gesmeurd. Het moet expliciet één mip-niveau hebben.
Het heeft het aantal steekproeven 1 en voorbeeldkwaliteit 0.
Het heeft een patroonindeling ONBEKENDE. Het kan impliciet geen indeling met rij-primaire indeling zijn, omdat cross-adapter niet is toegestaan.
De verwachte manier waarop de afbeeldingsgegevens van de schermruimte worden ingevuld, is om een van beide
- Schrijf de gegevens met behulp van een compute-shader; de schermruimteafbeelding is gebonden als een UAV, of
- Kopieer de gegevens naar de schermruimteafbeelding.
Wanneer u de schermruimteafbeelding maakt, zijn deze vlaggen toegestaan.
- GEEN
- ALLOW_UNORDERED_ACCESS
- DENY_SHADER_RESOURCE
Deze vlaggen zijn niet toegestaan.
- ALLOW_RENDER_TARGET
- ALLOW_DEPTH_STENCIL
- ALLOW_CROSS_ADAPTER
- ALLOW_SIMULTANEOUS_ACCESS
- VIDEO_DECODE_REFERENCE_ONLY
Het heap-type van de resource kan niet worden geüpload of teruggelezen.
De resource kan niet worden SIMULTANEOUS_ACCESS. De resource mag geen cross-adapter zijn.
Gegevens
Elke byte van de schermruimteafbeelding komt overeen met een waarde van de opsomming D3D12_SHADING_RATE.
Resourcestatus
Een resource moet worden overgezet naar een alleen-lezenstatus wanneer deze wordt gebruikt als een schermruimteafbeelding. Voor dit doel wordt een alleen-lezenstatus, D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE, gedefinieerd.
De afbeeldingsresource wordt uit die status overgezet om opnieuw beschrijfbaar te worden.
De afbeelding instellen
De schermruimteafbeelding voor het opgeven van de shaderfrequentie wordt ingesteld in de opdrachtlijst.
Een resource die is ingesteld als arceringsfrequentiebron, kan niet worden gelezen of geschreven vanuit een shader-fase.
Een null schermruimteafbeelding kan worden ingesteld voor het opgeven van de shadersnelheid. Dit heeft het effect dat 1x1 consistent wordt gebruikt als de bijdrage van de schermruimteafbeelding. De afbeelding van de schermruimte kan in eerste instantie worden beschouwd als ingesteld op null.
Promotie en verval
Een afbeeldingsresource voor de schermruimte heeft geen speciale gevolgen met betrekking tot promotie of verval.
Per primitief kenmerk
Een kenmerk per primitief voegt de mogelijkheid toe om een arceringsfrequentieterm op te geven als een kenmerk van een activerend hoekpunt. Dit kenmerk is plat gearceerd, dat wil gezegd, het wordt doorgegeven aan alle pixels in de huidige driehoek of lijnprimitief. Het gebruik van een per-primitieve kenmerk kan een nauwkeurigere controle van de beeldkwaliteit mogelijk maken in vergelijking met de andere arceringsfrequentieaanduidingen.
Het kenmerk per primitief is een semantische settabel met de naam SV_ShadingRate.
SV_ShadingRate bestaat als onderdeel van HLSL Shader Model 6.4.
Als een VS of GS SV_ShadingRateinstelt, maar VRS niet is ingeschakeld, heeft de semantische instelling geen effect. Als er geen waarde voor SV_ShadingRate per primitief wordt opgegeven, wordt een arceringssnelheidswaarde van 1x1 verondersteld als de per-primitieve bijdrage.
Arceringsfrequentiefactoren combineren
De verschillende arceringsfrequenties worden op volgorde toegepast met behulp van dit diagram.
Elk paar A en B wordt gecombineerd met behulp van een combinatie.
* Bij het opgeven van een shaderfrequentie per hoekpuntkenmerk.
- Als een geometrie-shader wordt gebruikt, kan hiervoor een arceringssnelheid worden opgegeven.
- Als er geen geometrie-shader wordt gebruikt, wordt de arceringssnelheid opgegeven door het activerende hoekpunt.
Lijst met combinaties
De volgende combinaties worden ondersteund. Een combinatie (C) en twee invoerwaarden (A en B) gebruiken.
- Passthrough-. C.xy = A.xy.
- overschrijven. C.xy = B.xy.
- hogere kwaliteit. C.xy = min(A.xy, B.xy).
- Lagere kwaliteit. C.xy = max(A.xy, B.xy).
- Kosten B toepassen ten opzichte van A-. C.xy = min(maxRate, A.xy + B.xy).
waarbij maxRate de grootste toegestane dimensie van grof pixel op het apparaat is. Dit zou zijn
-
D3D12_AXIS_SHADING_RATE_2X (dat wil gezegd, een waarde van 1), als AdditionalShadingRatesSupported is
false. -
D3D12_AXIS_SHADING_RATE_4X (dat wil gezegd, een waarde van 2), als AdditionalShadingRatesSupported
trueis.
De keuze van combinatie voor arcering met variabele snelheid wordt ingesteld in de opdrachtlijst via ID3D12GraphicsCommandList5::RSSetShadingRate.
Als er nooit combinaties zijn ingesteld, blijven ze standaard, wat PASSTHROUGH is.
Als de bron voor een combinatie een D3D12_AXIS_SHADING_RATEis, die niet is toegestaan in de ondersteuningstabel, wordt de invoer opgeschoond naar een arceringssnelheid die wordt ondersteund.
Als de uitvoer van een combinatie niet overeenkomt met een arceringssnelheid die wordt ondersteund op het platform, wordt het resultaat opgeschoond naar een arceringssnelheid die wordt ondersteund.
Standaardstatus en status wissen
Alle arceringsfrequentiebronnen, namelijk
- de opgegeven snelheid van de pijplijnstatus (opgegeven in de opdrachtlijst),
- de opgegeven snelheid van de schermruimte en
- het kenmerk per primitieve
een standaardwaarde van D3D12_SHADING_RATE_1X1hebben. De standaard combinaties zijn {PASSTHROUGH, PASSTHROUGH}.
Als er geen schermruimteafbeelding is opgegeven, wordt een arceringssnelheid van 1x1 afgeleid van die bron.
Als er geen kenmerk per primitieve is opgegeven, wordt een arceringssnelheid van 1x1 afgeleid van die bron.
ID3D12CommandList::ClearState de opgegeven frequentie van de pijplijnstatus opnieuw instelt op de standaardwaarde en de selectie van schermruimteafbeelding op de standaardwaarde van 'geen schermruimteafbeelding'.
Query's uitvoeren op arceringssnelheid met behulp van SV_ShadingRate
Het is handig om te weten welke arceringssnelheid is geselecteerd door de hardware bij een bepaalde pixel-shader-aanroep. Dit kan verschillende optimalisaties inschakelen in uw PS-code. Een systeemvariabele met alleen PS, SV_ShadingRate, biedt informatie over de arceringssnelheid.
Type
Het type van deze semantische is uint.
Gegevensinterpretatie
De gegevens worden geïnterpreteerd als een waarde van de opsomming D3D12_SHADING_RATE.
Als VRS niet wordt gebruikt
Als grove pixelarcering niet wordt gebruikt, SV_ShadingRate wordt teruggelezen als een waarde van 1x1, wat wijst op fijne pixels.
Gedrag onder uitvoering op basis van voorbeeld
Een pixel-shader mislukt compilatie als deze SV_ShadingRate invoert en ook uitvoering op basis van een voorbeeld gebruikt, bijvoorbeeld door SV_SampleIndexin te voeren of het trefwoord voorbeeldinterpolatie te gebruiken.
Opmerkingen over uitgestelde arcering
De verlichtingspassen van een uitgestelde arceringstoepassing moeten mogelijk weten welke arceringssnelheid is gebruikt voor welk gebied van het scherm. Dit is zo dat verlichtingspaszenders met een grofer snelheid kunnen lanceren. De variabele
SV_ShadingRatekan worden gebruikt om dit te bereiken als deze naar de gbuffer wordt geschreven.
Diepte en stencil
Wanneer grove pixelarcering wordt gebruikt, worden diepte en stencil en dekking altijd berekend en verzonden bij de volledige voorbeeldresolutie.
De aangevraagde arceringsfrequentie gebruiken
Voor alle lagen wordt verwacht dat als er een arceringsfrequentie wordt aangevraagd en dit wordt ondersteund in de combinatie op apparaat- en MSAA-niveau, dan is dat de arceringssnelheid die door de hardware wordt geleverd.
Een aangevraagde arceringssnelheid betekent een arceringssnelheid die wordt berekend als uitvoer van de combinaties (zie de Arceringsfrequentiefactoren combineren sectie in dit onderwerp).
Een ondersteunde arceringssnelheid is 1x1, 1x2, 2x1 of 2x2 in een renderingbewerking waarbij het aantal steekproeven kleiner is dan of gelijk is aan vier. Als de AdditionalShadingRatesSupported mogelijkheid is true, worden 2x4, 4x2 en 4x4 ook arceringssnelheden ondersteund voor sommige voorbeeldaantallen (zie de tabel in de Met arceringsvariabelen (VRS) sectie in dit onderwerp).
Schermruimtederivaten
Berekeningen van pixel-naar-aangrenzende pixelovergangen worden beïnvloed door grove pixelarcering. Wanneer bijvoorbeeld 2x2 grove pixels worden gebruikt, is een kleurovergang twee keer zo groot als wanneer er geen grof pixels worden gebruikt. Mogelijk wilt uw toepassing shaders aanpassen om dit te compenseren, afhankelijk van de gewenste functionaliteit.
Omdat mips worden gekozen op basis van een schermruimte-afgeleide, is het gebruik van grove pixelarcering van invloed op de mip-selectie. Het gebruik van grof pixelarcering zorgt ervoor dat minder gedetailleerde mips worden geselecteerd in vergelijking met wanneer grof pixels niet worden gebruikt.
Kenmerkinterpolatie
Invoer in een pixel-shader kan worden geïnterpoleerd op basis van de hoekpunten van de bron. Omdat arcering met variabele snelheid van invloed is op de gebieden van het doel dat door elke aanroep van de pixel-shader is geschreven, communiceert deze met kenmerkinterpolatie. De drie typen interpolatie zijn centreren, zwaartepunten en steekproeven.
Middelpunt
De centrale interpolatielocatie voor een grof pixel is het geometrische midden van het volledige grof pixelgebied.
SV_Position wordt altijd geïnterpoleerd in het midden van het grof pixelgebied.
Zwaartepunt
Wanneer grove pixelarcering wordt gebruikt met MSAA, worden er voor elke fijne pixel nog steeds schrijfbewerkingen uitgevoerd naar het volledige aantal steekproeven dat is toegewezen voor het MSAA-niveau van het doel. De locatie van de zwaartepuntsinterpolatie houdt dus rekening met alle steekproeven voor fijne pixels binnen grof pixels. Dat gezegd hebbende, wordt de locatie van de zwaartepuntsinterpolatie gedefinieerd als de eerste gedekte steekproef, in toenemende volgorde van de steekproefindex. De effectieve dekking van het voorbeeld is AND-ed met de bijbehorende bit van de rasterizerstatus SampleMask.
Notitie
Wanneer grove pixelarcering wordt gebruikt op laag 1, is SampleMask altijd een volledig masker. Als SampleMask is geconfigureerd om geen volledig masker te zijn, wordt grove pixelarcering uitgeschakeld op laag 1.
Voorbeelduitvoering
Uitvoering op basis van een voorbeeld, of supersampling, die wordt veroorzaakt door het gebruik van de functie voor voorbeeldinterpolatie, kan worden gebruikt met grove pixelarcering en zorgt ervoor dat de pixel-shader per steekproef wordt aangeroepen. Voor doelen van het aantal steekproeven N wordt de pixel-shader N keer per pixel aangeroepen.
EvaluateAttributeSnapped
Intrinsieke kenmerken van pull-modellen zijn niet compatibel met grove pixelarcering op laag 1. Als er een poging is om pull-model intrinsiek te gebruiken met grove pixelarcering op laag 1, wordt grof pixelarcering automatisch uitgeschakeld.
De intrinsieke EvaluateAttributeSnapped mag worden gebruikt met grove pixelarcering op laag 2. De syntaxis is hetzelfde als altijd.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
Voor context heeft EvaluateAttributeSnapped een offsetparameter met twee velden. Wanneer u zonder grof pixelarcering gebruikt, worden alleen de kleine volgorde vier bits uit de volledige dertig-twee gebruikt. Deze vier bits vertegenwoordigen het bereik [-8, 7]. Dit bereik beslaat een raster van 16x16 binnen een pixel. Het bereik is zodanig dat de boven- en linkerranden van de pixel zijn opgenomen en dat de onder- en rechterranden niet zijn. Verschuiving (-8, -8) bevindt zich in de linkerbovenhoek en verschuiving (7, 7) bevindt zich in de rechterbenedenhoek. Verschuiving (0, 0) is het midden van de pixel.
Bij gebruik met grove pixelarcering kan EvaluateAttributeSnappedoffsetparameter een breder bereik van locaties opgeven. De offsetparameter selecteert een raster van 16x16 voor elke fijne pixel en er zijn meerdere fijne pixels. Het uitdrukbare bereik en het daaropvolgende aantal gebruikte bits is afhankelijk van de grove pixelgrootte. De boven- en linkerranden van de grof pixel zijn opgenomen en de onder- en rechterranden zijn niet.
In de onderstaande tabel wordt de interpretatie van de offsetparameter van EvaluateAttributeSnappedvoor elke grove pixelgrootte beschreven.
Offsetbereik evaluateAttributeSnapped
| Grof pixelformaat | Indexeerbaar bereik | Vertegenwoordigbare bereikgrootte | Aantal bits dat nodig is {x, y} | Binair masker van bruikbare bits |
|---|---|---|---|---|
| 1x1 (prima) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {0000000000000xxxx, 00000000000000xxxx} |
| 1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {000000000000xxxxxx, 000000000000xxxxx} |
| 2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {0000000000xxxxxxx, 00000000000000xxxx} |
| 2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {0000000000xxxxxxx, 00000000000xxxxx} |
| 2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {0000000000xxxxx, 00000000000xxxxxx} |
| 4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {0000000000xxxxxxxx, 000000000000xxxxx} |
| 4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {0000000000xxxxxxxx, 00000000000xxxxxx} |
De onderstaande tabellen zijn een handleiding voor conversie van de vaste komma naar decimale en fractionele weergave. De eerste bruikbare bit in het binaire masker is de tekenbit en de rest van het binaire masker bestaat uit het numerieke gedeelte.
Het getalschema voor vier-bits waarden die worden doorgegeven aan EvaluateAttributeSnapped is niet specifiek voor arcering met variabele frequentie. Het wordt hier herhaald voor volledigheid.
Voor vier-bits waarden.
| Binaire waarde | Decimaal | Fractionele |
|---|---|---|
| 1000 | -0,5f | -8 / 16 |
| 1001 | -0,4375f | -7 / 16 |
| 1010 | -0,375f | -6 / 16 |
| 1011 | -0.3125f | -5 / 16 |
| 1100 | -0,25f | -4 / 16 |
| 1101 | -0,1875f | -3 / 16 |
| 1110 | -0,125f | -2 / 16 |
| 1111 | -0,0625f | -1 /16 |
| 0000 | 0,0f | 0 / 16 |
| 0001 | -0,0625f | 1 / 16 |
| 0010 | -0,125f | 2 / 16 |
| 0011 | -0,1875f | 3 / 16 |
| 0100 | -0,25f | 4 / 16 |
| 0101 | -0.3125f | 5 / 16 |
| 0110 | -0,375f | 6 / 16 |
| 0111 | -0,4375f | 7 / 16 |
Voor vijf bitswaarden.
| Binaire waarde | Decimaal | Fractionele |
|---|---|---|
| 10000 | -1 | -16 / 16 |
| 10001 | -0.9375 | -15 / 16 |
| 10010 | -0.875 | -14 / 16 |
| 10011 | -0.8125 | -13 / 16 |
| 10100 | -0.75 | -12 / 16 |
| 10101 | -0.6875 | -11 / 16 |
| 10110 | -0.625 | -10 / 16 |
| 10111 | -0.5625 | -9 / 16 |
| 11000 | -0.5 | -8 / 16 |
| 11001 | -0.4375 | -7 / 16 |
| 11010 | -0.375 | -6 / 16 |
| 11011 | -0.3125 | -5 / 16 |
| 11100 | -0.25 | -4 / 16 |
| 11101 | -0.1875 | -3 / 16 |
| 11110 | -0.125 | -2 / 16 |
| 11111 | -0.0625 | -1 / 16 |
| 00000 | 0 | 0 / 16 |
| 00001 | 0.0625 | 1 / 16 |
| 00010 | 0.125 | 2 / 16 |
| 00011 | 0.1875 | 3 / 16 |
| 00100 | 0.25 | 4 / 16 |
| 00101 | 0.3125 | 5 / 16 |
| 00110 | 0.375 | 6 / 16 |
| 00111 | 0.4375 | 7 / 16 |
| 01000 | 0.5 | 8 / 16 |
| 01001 | 0.5625 | 9 / 16 |
| 01010 | 0.625 | 10 / 16 |
| 01011 | 0.6875 | 11 / 16 |
| 01100 | 0.75 | 12 / 16 |
| 01101 | 0.8125 | 13 / 16 |
| 01110 | 0.875 | 14 / 16 |
| 01111 | 0.9375 | 15 / 16 |
Voor zes-bits waarden.
| Binaire waarde | Decimaal | Fractionele |
|---|---|---|
| 100000 | -2 | -32 / 16 |
| 100001 | -1.9375 | -31 / 16 |
| 100010 | -1.875 | -30 / 16 |
| 100011 | -1.8125 | -29 / 16 |
| 100100 | -1.75 | -28 / 16 |
| 100101 | -1.6875 | -27 / 16 |
| 100110 | -1.625 | -26 / 16 |
| 100111 | -1.5625 | -25 / 16 |
| 101000 | -1.5 | -24 / 16 |
| 101001 | -1.4375 | -23 / 16 |
| 101010 | -1.375 | -22 / 16 |
| 101011 | -1.3125 | -21 / 16 |
| 101100 | -1.25 | -20 / 16 |
| 101101 | -1.1875 | -19 / 16 |
| 101110 | -1.125 | -18 / 16 |
| 101111 | -1.0625 | -17 / 16 |
| 110000 | -1 | -16 / 16 |
| 110001 | -0.9375 | -15 / 16 |
| 110010 | -0.875 | -14 / 16 |
| 110011 | -0.8125 | -13 / 16 |
| 110100 | -0.75 | -12 / 16 |
| 110101 | -0.6875 | -11 / 16 |
| 110110 | -0.625 | -10 / 16 |
| 110111 | -0.5625 | -9 / 16 |
| 111000 | -0.5 | -8 / 16 |
| 111001 | -0.4375 | -7 / 16 |
| 111010 | -0.375 | -6 / 16 |
| 111011 | -0.3125 | -5 / 16 |
| 111100 | -0.25 | -4 / 16 |
| 111101 | -0.1875 | -3 / 16 |
| 111110 | -0.125 | -2 / 16 |
| 111111 | -0.0625 | -1 / 16 |
| 000000 | 0 | 0 / 16 |
| 000001 | 0.0625 | 1 / 16 |
| 000010 | 0.125 | 2 / 16 |
| 000011 | 0.1875 | 3 / 16 |
| 000100 | 0.25 | 4 / 16 |
| 000101 | 0.3125 | 5 / 16 |
| 000110 | 0.375 | 6 / 16 |
| 000111 | 0.4375 | 7 / 16 |
| 001000 | 0.5 | 8 / 16 |
| 001001 | 0.5625 | 9 / 16 |
| 001010 | 0.625 | 10 / 16 |
| 001011 | 0.6875 | 11 / 16 |
| 001100 | 0.75 | 12 / 16 |
| 001101 | 0.8125 | 13 / 16 |
| 001110 | 0.875 | 14 / 16 |
| 001111 | 0.9375 | 15 / 16 |
| 010000 | 1 | 16 / 16 |
| 010001 | 1.0625 | 17 / 16 |
| 010010 | 1.125 | 18 / 16 |
| 010011 | 1.1875 | 19 / 16 |
| 010100 | 1.25 | 20 / 16 |
| 010101 | 1.3125 | 21 / 16 |
| 010110 | 1.375 | 22 / 16 |
| 010111 | 1.4375 | 23 / 16 |
| 011000 | 1.5 | 24 / 16 |
| 011001 | 1.5625 | 25 / 16 |
| 011010 | 1.625 | 26 / 16 |
| 011011 | 1.6875 | 27 / 16 |
| 011100 | 1.75 | 28 / 16 |
| 011101 | 1.8125 | 29 / 16 |
| 011110 | 1.875 | 30 / 16 |
| 011111 | 1.9375 | 31 / 16 |
Op dezelfde manier als met fijne pixels wordt het raster van evalueerbare locaties van EvaluateAttributeSnappedgecentreerd in het coarse pixelcentrum bij het gebruik van grove pixelarcering.
SetSamplePositions
Wanneer de API ID3D12GraphicsCommandList1::SetSamplePositions wordt gebruikt met grove arcering, stelt de API de voorbeeldposities in voor fijne pixels.
SV_Coverage
Als SV_Coverage wordt gedeclareerd als een shader-invoer of -uitvoer op laag 1, wordt grof pixelarcering uitgeschakeld.
U kunt de SV_Coverage semantisch met grove pixelarcering op laag 2 gebruiken en het geeft aan welke voorbeelden van een MSAA-doel worden geschreven.
Wanneer grove pixelarcering wordt gebruikt, zodat meerdere bron pixels een tegel vormen, vertegenwoordigt het dekkingsmasker alle voorbeelden die afkomstig zijn van die tegel.
Gezien de compatibiliteit van grove pixelarcering met MSAA, kan het aantal dekkings bits dat moet worden opgegeven variëren. Bijvoorbeeld, met een 4x MSAA-resource die gebruikmaakt van D3D12_SHADING_RATE_2x2, schrijft elke grof pixel naar vier fijne pixels en elke fijne pixel heeft vier steekproeven. Dit betekent dat elke grof pixel schrijft naar een totaal van 4 * 4 = 16 monsters.
Aantal benodigde dekkings-bits
De volgende tabel geeft aan hoeveel dekkingsbits er nodig zijn voor elke combinatie van grof pixelformaat en MSAA-niveau.
Zoals aangegeven in de tabel, is het niet mogelijk om grof pixels te gebruiken om meer dan 16 voorbeelden tegelijk te schrijven met behulp van de functie voor arcering met variabele snelheid die beschikbaar is via Direct3D 12. Deze beperking komt door de beperkingen van Direct3D 12 met betrekking tot welke MSAA-niveaus zijn toegestaan met een grove pixelgrootte (zie de tabel in de Met VRS- sectie in dit onderwerp).
De volgorde en indeling van bits in het dekkingsmasker
De bits van het dekkingsmasker houden zich aan een goed gedefinieerde volgorde. Het masker bestaat uit dekkingen van pixels van links naar rechts en vervolgens van boven naar beneden (kolom-primaire) volgorde. Dekkings bits zijn de laag-orde bits van de dekking semantisch en zijn dicht verpakt.
In de onderstaande tabel ziet u de indeling van het dekkingsmasker voor ondersteunde combinaties van grof pixelformaat en MSAA-niveau.
In de volgende tabel ziet u 2x MSAA-pixels, waarbij elke pixel twee voorbeelden van indexen 0 en 1 bevat.
De plaatsing van de labels van steekproeven op de pixels is bedoeld ter illustratie en brengt niet noodzakelijkerwijs de ruimtelijke {X, Y} locaties van monsters op die pixel over; met name gezien het feit dat voorbeeldposities programmatisch kunnen worden gewijzigd. Voorbeelden worden aangeduid door hun index op basis van 0.
In de volgende tabel ziet u 4x MSAA-pixels, waarbij elke pixel vier voorbeelden van indexen 0, 1, 2 en 3 bevat.
Afdanken
Wanneer de semantische HLSL-discard wordt gebruikt met grove pixelarcering, worden grove pixels verwijderd.
Doelonafhankelijke rasterisatie (TIR)
TIR wordt niet ondersteund wanneer grove pixelarcering wordt gebruikt.
Rastervolgordeweergaven (ROV's)
ROV-interlocks worden opgegeven als operationeel bij fijne pixelgranulariteit. Als arcering per steekproef wordt uitgevoerd, werken de interlocks bij de granulariteit van de steekproef.
Conservatieve rasterisering
U kunt conservatieve rasterisatie gebruiken met arcering met variabele snelheid. Wanneer conservatieve rasterisering wordt gebruikt met grove pixelarcering, worden fijne pixels binnen grof pixels conservatief gerasterd door volledige dekking te krijgen.
Dekking
Wanneer conservatieve rasterisering wordt gebruikt, bevat de dekking semantisch volledige maskers voor fijne pixels die worden gedekt en 0 voor fijne pixels die niet worden gedekt.
Bundels
U kunt arcerings-API's voor variabele frequentie aanroepen in een bundel.
Geslaagde weergaven
U kunt arcerings-API's voor variabele snelheid aanroepen in een render-.
De VRS-API's aanroepen
In deze volgende sectie wordt beschreven hoe variabele arcering toegankelijk is voor uw toepassing via Direct3D 12.
Mogelijkheidsquery's uitvoeren
Als u een query wilt uitvoeren op de mogelijkheid voor het arceren van variabelen van de adapter, roept u ID3D12Device::CheckFeatureSupport aan met D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6en geeft u een D3D12_FEATURE_DATA_D3D12_OPTIONS6 structuur op zodat de functie voor u kan invullen. De D3D12_FEATURE_DATA_D3D12_OPTIONS6 structuur bevat verschillende leden, waaronder een van het geïnventariseerd type D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) en een die aangeeft of achtergrondverwerking wordt ondersteund (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).
U kunt dit bijvoorbeeld doen om een query uit te voeren op laag 1-mogelijkheden.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return
SUCCEEDED(m_device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS6,
&options,
sizeof(options))) &&
options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;
Arceringssnelheden
De waarden in de D3D12_SHADING_RATE opsomming zijn ingedeeld, zodat arceringssnelheden eenvoudig kunnen worden gedecomposeerd in twee assen, waarbij de waarden van elke as compact worden weergegeven in logaritmische ruimte volgens de D3D12_AXIS_SHADING_RATE opsomming.
U kunt een macro maken om twee asarceringssnelheden op te stellen in een arceringssnelheid zoals deze.
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
D3D12_AXIS_SHADING_RATE_2X,
D3D12_AXIS_SHADING_RATE_1X)
Het platform biedt ook deze macro's, gedefinieerd in d3d12.h.
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
Deze kunnen worden gebruikt om SV_ShaderRatete ontleden en te begrijpen.
Notitie
Deze gegevensinterpretatie is gericht op het beschrijven van de schermruimteafbeelding, die kan worden bewerkt door shaders. Dat wordt verder besproken in de bovenstaande secties. Maar er is geen reden om geen consistente definitie te hebben van de grof pixelgrootten die overal moeten worden gebruikt, inclusief bij het instellen van de arceringsfrequentie op opdrachtniveau.
Arceringsfrequentie en combinaties op opdrachtniveau instellen
De arceringssnelheid en optioneel worden combinaties opgegeven via de methode ID3D12GraphicsCommandList5::RSSetShadingRate. U geeft een D3D12_SHADING_RATE-waarde door voor de basisarceringsfrequentie en een optionele matrix met D3D12_SHADING_RATE_COMBINER waarden.
De schermruimteafbeelding voorbereiden
De alleen-lezen resourcestatus die een afbeelding van een bruikbare arceringsfrequentie aangeeft, wordt gedefinieerd als D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE.
De schermruimteafbeelding instellen
U geeft de schermruimteafbeelding op via de methode ID3D12GraphicsCommandList5::RSSetShadingRateImage.
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Query's uitvoeren op de tegelgrootte
U kunt een query uitvoeren op de tegelgrootte van het D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize lid. Zie Capability query's uitvoeren hierboven.
Eén dimensie wordt opgehaald, omdat de horizontale en verticale dimensies altijd hetzelfde zijn. Als de mogelijkheid van het systeem D3D12_SHADING_RATE_TIER_NOT_SUPPORTEDis, is de geretourneerde tegelgrootte 0.