Delen via


Direct3D 12 Conservatieve rasterisering

Conservatieve rasterisering voegt enige zekerheid toe aan pixelweergave, wat met name nuttig is voor botsingsdetectiealgoritmen.

Overzicht

Conservatieve rasterisering betekent dat alle pixels die ten minste gedeeltelijk worden gedekt door een gerenderde primitieve, worden gerasterd, wat betekent dat de pixel-shader wordt aangeroepen. Normaal gedrag is steekproeven, die niet worden gebruikt als Conservatieve rasterisatie is ingeschakeld.

Conservatieve rasterisering is nuttig in een aantal situaties, waaronder voor zekerheid bij botsingsdetectie, occlusie-afruiming en tegelweergave.

In de volgende afbeelding ziet u bijvoorbeeld een groene driehoek die wordt weergegeven met conservatieve rasterisatie, zoals deze in de rasterizer wordt weergegeven (dat wil gezegd, met behulp van 16,8 vaste puntpuntcoördinaten). Het bruine gebied staat bekend als een "onzekerheidsregio": een conceptueel gebied dat de uitgebreide grenzen van de driehoek vertegenwoordigt, die vereist is om ervoor te zorgen dat de primitieve in de rasterizer conservatief is ten opzichte van de oorspronkelijke coördinaten van het drijvendekommapunt. De rode vierkantjes op elk hoekpunt laten zien hoe de onzekerheidsregio wordt berekend: als een geveegd vierkant.

De grote grijze vierkantjes geven de pixels weer die worden weergegeven. De roze vierkantjes geven pixels weer die worden weergegeven met behulp van de 'Top-Left-regel', die wordt afgespeeld als de rand van de driehoek de rand van de pixels overschrijdt. Er kunnen fout-positieven zijn (pixels ingesteld die niet moeten zijn geweest) die het systeem normaal zal doen, maar niet altijd ruimen.

de regel linksboven

Interacties met de pijplijn

Interactie met rasterregels

In de modus Conservatieve rasterisering worden rasterregels op dezelfde manier toegepast als wanneer de modus Conservatieve rasterisering niet is ingeschakeld met uitzonderingen voor de Top-Left-regel, zoals hierboven wordt beschreven en Pixeldekking. 16,8 Fixed-Point Rasterizer-precisie moet worden gebruikt.

Pixels die niet worden gedekt als hardware volledige drijvendekommapuntcoördinaten gebruikt, kan alleen worden opgenomen als ze zich binnen een onzekerheidsgebied bevinden, niet groter dan een halve pixel in het domein met vaste punten. Toekomstige hardware zal naar verwachting de aangescherpte onzekerheidsregio bereiken die is opgegeven in laag 2. Houd er rekening mee dat deze vereiste voorkomt dat sliiverdriehoeken verder worden uitgebreid dan nodig is.

Een vergelijkbare geldige onzekerheidsregio is ook van toepassing op InnerCoverage, maar het is strakker omdat voor dit geval geen implementaties een grotere onzekerheidsregio vereisen. Zie Interactie met InnerCoverage voor meer informatie.

Binnenste en buitenste onzekerheidsregio's moeten groter zijn dan of gelijk zijn aan de grootte van de helft van het sub pixelraster, of 1/512 van een pixel, in het domein met vaste punten. Dit is de minimaal geldige onzekerheidsregio. 1/512 komt uit de 16,8 vaste punt rasterizer coördinaatweergave en de round-to-dichtstbijzijnde regel die van toepassing is bij het converteren van drijvendekommapuntcoördinaten naar 16,8 vaste-puntcoördinaten. 1/512 kan veranderen als de precisie van rasterizer verandert. Als een implementatie deze minimale onzekerheidsregio implementeert, moeten ze de Top-Left regel volgen wanneer een rand of hoek van de onzekerheidsregio langs de rand of hoek van een pixel valt. De afgekapte randen van het onzekerheidsgebied moeten worden behandeld als het dichtstbijzijnde hoekpunt, wat betekent dat het telt als twee randen: de twee die bij het bijbehorende hoekpunt worden samengevoegd. Top-Left regel is vereist wanneer de minimale onzekerheid regio wordt gebruikt, omdat als dit niet het geval is, een conservatieve rasterisatie-implementatie niet kan rasteriseren pixels die kunnen worden gedekt wanneer de conservatieve rastermodus is uitgeschakeld.

In het volgende diagram ziet u een geldige buitenste onzekerheidsregio die wordt geproduceerd door een vierkant rond de randen van de primitieven in het vaste puntdomein te vegen (d.w.w.v. de hoekpunten zijn gekwantiseerd door de vaste puntweergave van 16,8). De afmetingen van dit vierkant zijn gebaseerd op de geldige buitengrensgebiedgrootte: voor de 1/2 van een pixel is het vierkant 1 pixel in breedte en hoogte, voor 1/512 van een pixel, het vierkant 1/256 van een pixel in breedte en hoogte. De groene driehoek vertegenwoordigt een bepaalde primitieve, de rode stippellijn vertegenwoordigt de grens op overschat conservatieve rasterisering, de ononderbroken zwarte vierkantjes vertegenwoordigen het vierkant dat langs de primitieve randen wordt geveegd en het blauwe ingecheckte gebied is de buitenste onzekerheidsregio:

buitenste onzekerheidsregio.

Interactie met multisampling

Ongeacht het aantal steekproeven in RenderTarget/DepthStencil oppervlakken (of ForcedSampleCount wordt gebruikt), worden alle voorbeelden gedekt voor pixels die worden gerasterd door conservatieve rasterisering. Afzonderlijke steekproeflocaties worden niet getest of ze in de primitieve of niet vallen.

SampleMask-interactie

De SampleMask Rasterizer State is op dezelfde manier van toepassing als wanneer Conservatieve rasterisatie niet is ingeschakeld voor InputCoverage, maar niet van invloed is op InnerCoverage (dat wil gezegd niet en is niet opgenomen in een invoer die is gedeclareerd met InnerCoverage). Dit komt doordat InnerCoverage niet gerelateerd is aan of MSAA-monsters worden gemaskeerd: 0 InnerCoverage betekent alleen dat de pixel niet gegarandeerd volledig wordt gedekt, niet dat er geen monsters worden bijgewerkt.

Diepte-/stenciltestinteractie

Diepte-/stenciltests worden uitgevoerd voor een conservatief gerasterde pixel op dezelfde manier als wanneer conservatieve rasterisering niet is ingeschakeld.

Als u doorgaat met alle gedekte monsters, kan diepte-extrapolatie veroorzaken, wat geldig is en moet worden vastgeklemd aan de viewport zoals opgegeven wanneer Conservatieve rasterisatie niet is ingeschakeld. Dit is vergelijkbaar met wanneer pixelfrequentieinterpolatiemodi worden gebruikt op een RenderTarget- met een steekproefaantal dat groter is dan 1, hoewel in het geval van conservatieve rasterisering de dieptewaarde van de vaste functie die kan worden geëxtrapoleerd.

Vroege diepteafbrekingsgedrag met Diepte-extrapolatie is niet gedefinieerd. Dit komt doordat sommige Early Depth-afruimingshardware niet goed ondersteuning bieden voor extra geïsoleerde dieptewaarden. Vroege diepteverruimingsgedrag in aanwezigheid van Diepte-extrapolatie is echter problematisch, zelfs met hardware die ondersteuning kan bieden voor geëxtrapoleerde dieptewaarden. Dit probleem kan worden omzeild door de Pixel Shader-invoerdiepte te klemmen tot de minimale en maximale dieptewaarden van de primitieve die worden gerasterd en die waarde naar oDepth te schrijven (het pixel-shader-uitvoerdiepteregister). Implementaties zijn vereist voor het uitschakelen van Early Depth-afdring in dit geval, vanwege de oDepth schrijven.

Interactie van Helper Pixel

Helper Pixel-regels gelden op dezelfde manier als wanneer Conservatieve rasterisatie niet is ingeschakeld. Als onderdeel hiervan moeten alle pixels, inclusief Helper Pixels, InputCoverage nauwkeurig rapporteren zoals is opgegeven in de sectie InputCoverage interactie. Dus volledig niet-gedekte pixels rapporteren 0 dekking.

Interactie uitvoerdekking

Output Coverage (oMask) gedraagt zich voor een conservatief gerasterde pixel, net als wanneer Conservatieve rasterisering niet is ingeschakeld voor alle voorbeelden die worden behandeld.

InputCoverage-interactie

In de conservatieve rastermodus wordt dit invoerregister gevuld alsof alle voorbeelden worden gedekt wanneer Conservatieve rasterisering niet is ingeschakeld voor een bepaalde conservatief gerasterde pixel. Dat wil zeggen dat alle bestaande interacties van toepassing zijn (bijvoorbeeld SampleMask wordt toegepast) en de eerste n bits in InputCoverage van de LSB zijn ingesteld op 1 voor een conservatief gerasterde pixel, gegeven een n steekproef per pixel RenderTarget en/of DepthStencil buffer gebonden aan de Output Merger, of een n voorbeeld ForcedSampleCount. De rest van de bits zijn 0.

Deze invoer is beschikbaar in een shader, ongeacht het gebruik van Conservatieve rasterisatie, hoewel conservatieve rasterisering het gedrag ervan wijzigt zodat alleen alle voorbeelden worden weergegeven die worden behandeld (of geen voor Helper Pixels).

Interactie tussen InnerCoverage

Deze functie is vereist voor, en alleen beschikbaar in laag 3. De runtime mislukt het maken van shader voor shaders die deze modus gebruiken wanneer een implementatie een laag minder dan laag 3 ondersteunt.

De Pixel Shader heeft een 32-bits scalaire geheel getal systeem genereren waarde beschikbaar: InnerCoverage. Dit is een bit-veld met bit 0 van de LSB ingesteld op 1 voor een gegeven conservatief gerasterde pixel, alleen wanneer die pixel volledig binnen de huidige primitieve is. Alle andere invoerregister-bits moeten worden ingesteld op 0 wanneer bit 0 niet is ingesteld, maar niet gedefinieerd zijn wanneer bit 0 is ingesteld op 1 (in feite vertegenwoordigt dit bitveld een Booleaanse waarde waarbij onwaar precies 0 moet zijn, maar waar kan elke oneven waarde zijn (dat wil zeggen bit 0 ingesteld) niet-nulwaarde). Deze invoer wordt gebruikt voor onderschatte conservatieve rasterisatie-informatie. Het informeert de Pixel Shader of de huidige pixel volledig binnen de geometrie ligt.

Dit moet rekening houden met het vastmaken van fouten bij oplossingen die groter zijn dan of gelijk zijn aan de resolutie waarmee de huidige draw wordt gebruikt. Er mogen geen fout-positieven zijn (het instellen van InnerCoverage bits wanneer de pixel niet volledig wordt gedekt voor een vastmakende fout bij oplossingen die groter zijn dan of gelijk zijn aan de resolutie waarop de huidige draw werkt), maar fout-negatieven zijn toegestaan. Kortom, de implementatie mag pixels niet onjuist identificeren als volledig gedekt dat niet met volledige drijvendekommapuntcoördinaten in rasterizer zou zijn.

Pixels die volledig worden gedekt als hardware volledige drijvendekommapuntcoördinaten gebruikt, mag alleen worden weggelaten als ze de binnenste onzekerheidsregio kruisen, die niet groter moeten zijn dan de grootte van het sub pixelraster of 1/256 van een pixel, in het vaste puntdomein. Dat wil zeggen dat pixels volledig binnen de binnengrens van de binnenste onzekerheidsregio als volledig moeten worden gemarkeerd. De binnengrens van de onzekerheidsregio wordt geïllustreerd in het onderstaande diagram door de vette zwarte stippellijn. 1/256 komt uit de 16,8 vaste punt rasterizer coördinaatweergave, die kan veranderen als de precisie van rasterizer verandert. Deze onzekerheidsregio is voldoende om rekening te houden met vastmakende fouten die worden veroorzaakt door de conversie van drijvendekommapuntcoördinaten naar vaste puntpuntcoördinaten in de Rasterizer.

Dezelfde minimale onzekerheidsregiovereisten van 1/512 die in de interactie rasterregels zijn gedefinieerd, zijn hier ook van toepassing.

In het volgende diagram ziet u een geldige interne onzekerheidsregio die wordt geproduceerd door een vierkant rond de randen van de primitieven in het vaste puntdomein te vegen (d.w.w.v. de hoekpunten zijn gekwantiseerd door de vaste puntweergave van 16,8). De afmetingen van dit vierkant zijn gebaseerd op de geldige binnenonzekerheidsgebiedgrootte: voor 1/256 van een pixel is het vierkant 1/128 van een pixel in breedte en hoogte. De groene driehoek vertegenwoordigt een bepaalde primitieve, de vetgedrukte zwarte stippellijn vertegenwoordigt de grens van de binnenste onzekerheidsregio, de ononderbroken zwarte vierkantjes vertegenwoordigen het vierkant dat langs de primitieve randen wordt geveegd en het oranje ingecheckte gebied is de binnenste onzekerheidsregio:

innerlijke onzekerheid.

Het gebruik van InnerCoverage heeft geen invloed op het feit of een pixel conservatief wordt gerasterd, d.w.w.v. het gebruik van een van deze InputCoverage modi heeft geen invloed op welke pixels worden gerasterd wanneer de conservatieve rastermodus is ingeschakeld. Wanneer InnerCoverage wordt gebruikt en de Pixel Shader een pixel verwerkt die niet volledig wordt bedekt door de geometrie, is de waarde 0, maar de Pixel Shader-aanroep zal voorbeelden hebben bijgewerkt. Dit verschilt van wanneer InputCoverage 0 is, wat betekent dat er geen steekproeven worden bijgewerkt.

Deze invoer sluiten elkaar wederzijds uit met InputCoverage: beide kunnen niet worden gebruikt.

Als u toegang wilt krijgen tot InnerCoverage, moet deze worden gedeclareerd als één onderdeel uit een van de Pixel Shader-invoerregisters. De interpolatiemodus voor de declaratie moet constant zijn (interpolatie is niet van toepassing).

Het InnerCoverage-bitveld wordt niet beïnvloed door diepte-/stenciltests en wordt ook niet ge ANDed met de status SampleMask Rasterizer.

Deze invoer is alleen geldig in de modus Conservatieve rasterisatie. Wanneer Conservatieve rasterisatie niet is ingeschakeld, produceert InnerCoverage een niet-gedefinieerde waarde.

Pixel Shader-aanroepen die worden veroorzaakt door de noodzaak van Helper Pixels, maar anders niet gedekt door de primitieve, moet het InnerCoverage register zijn ingesteld op 0.

Interactie tussen interpolatie van kenmerken

Kenmerkinterpolatiemodi zijn ongewijzigd en gaan op dezelfde manier als wanneer Conservatieve rasterisatie niet is ingeschakeld, waarbij de met viewport geschaalde en met vaste punten geconverteerde hoekpunten worden gebruikt. Omdat alle steekproeven in een conservatief gerasterde pixel als gedekt worden beschouwd, is het geldig voor waarden die moeten worden geëxtrapoleerd, vergelijkbaar met wanneer pixelfrequentieinterpolatiemodi worden gebruikt op een RenderTarget- met een steekproefaantal groter dan 1. Zwaartepuntinterpolatiemodi produceren resultaten die identiek zijn aan de overeenkomstige niet-zwaartepuntinterpolatiemodus; het begrip zwaartepunt is betekenisloos in dit scenario, waarbij de steekproefdekking slechts volledig of 0 is.

Conservatieve rasterisering maakt het mogelijk om driehoeken met Pixel Shader-aanroepen te produceren. Daarom moeten de waarden die aan Hoekpunt 0 zijn toegewezen, worden gebruikt voor alle geïnterpoleerde waarden.

Interactie tussen knipsels

Wanneer de modus Conservatieve rasterisatie is ingeschakeld en diepteclip is uitgeschakeld (wanneer de DepthClipEnable Rasterizer-status is ingesteld op FALSE), kunnen er afwijkingen zijn in kenmerkinterpolatie voor segmenten van een primitieve die buiten de 0 <= z <= w-bereik vallen, afhankelijk van de implementatie: er worden constante waarden gebruikt vanaf een punt waar de primitieve primitief het relevante vlak kruist (bijna of ver) of kenmerkinterpolatie gedraagt zich alsof de conservatieve rastermodus is uitgeschakeld. Het gedrag van de dieptewaarde is echter hetzelfde, ongeacht de modus Conservatieve rasterisering, d.w. primitieven die buiten het dieptebereik vallen, moeten nog steeds de waarde krijgen van de dichtstbijzijnde limiet van het dieptebereik van de viewport. Gedrag van kenmerkinterpolatie binnen de 0 <= z <= w-bereik moet ongewijzigd blijven.

Interactie tussen clipafstand

Clipafstand is geldig wanneer de modus Conservatieve rasterisering is ingeschakeld en zich gedraagt voor een conservatief gerasterde pixel, net als wanneer Conservatieve rasterisatie niet is ingeschakeld met alle behandelde voorbeelden.

Houd er rekening mee dat conservatieve rastervorming kan leiden tot extrapolatie van de W-hoekpuntcoördinaat, wat W <= 0 kan veroorzaken. Dit kan ertoe leiden dat implementaties van clipafstand per pixel worden uitgevoerd op een clipafstand die is gedeeld door een ongeldige W-waarde. Implementaties van clipafstand moeten beschermen tegen het aanroepen van rasterisatie voor pixels waarbij hoekpuntcoördinaat W <= 0 (bijvoorbeeld vanwege extrapolatie in de conservatieve rastermodus).

Interactie voor onafhankelijke rasterisering van doel

De conservatieve rasteriseringsmodus is compatibel met Target Independent Rasterization (TIR). TIR-regels en -beperkingen gelden, die zich gedragen voor een conservatief gerasterde pixel alsof alle monsters worden gedekt.

Interactie met IA Primitieve topologie

Conservatieve rasterisering is niet gedefinieerd voor lijn- of puntprimitief. Daarom produceren primitieve topologieën die punten of lijnen opgeven niet-gedefinieerd gedrag als ze worden ingevoerd in de rasterizer-eenheid wanneer Conservatieve rasterisatie is ingeschakeld.

De validatie van de foutopsporingslaag controleert of toepassingen deze primitieve topologieën niet gebruiken.

Queryinteractie

Voor een conservatief gerasterde pixel gedragen query's zich zoals ze doen wanneer Conservatieve rasterisatie niet is ingeschakeld wanneer alle voorbeelden worden behandeld. Voor een conservatief gerasterde pixel moeten D3D12_QUERY_TYPE_OCCLUSION en D3D12_QUERY_TYPE_PIPELINE_STATISTICS (van D3D12_QUERY_TYPE) zich bijvoorbeeld gedragen als conservatieve rasterisering niet is ingeschakeld wanneer alle voorbeelden worden behandeld.

Pixel Shader-aanroepen moeten worden verhoogd voor elke conservatief gerasterde pixel in de conservatieve rasteriseringsmodus.

Interactie met De staat van de ruiming

Alle Cull States zijn geldig in de modus Conservatieve rasterisatie en volgen dezelfde regels als wanneer Conservatieve Rasterisatie niet is ingeschakeld.

Bij het vergelijken van conservatieve rasterisering tussen resoluties op zichzelf of zonder conservatieve rasterisering ingeschakeld, is er de mogelijkheid dat sommige primitieven mogelijk niet-overeenkomende gezichten hebben (dat wil gezegd één ruggezicht, de andere voorzijde). Toepassingen kunnen deze onzekerheid voorkomen door gebruik te maken van D3D12_CULL_MODE_NONE (van D3D12_CULL_MODE) en niet met behulp van de IsFrontFace door het systeem gegenereerde waarde.

Interactie met IsFrontFace

De IsFrontFace door het systeem gegenereerde waarde is geldig voor gebruik in de modus Conservatieve rasterisatie en volgt het gedrag dat is gedefinieerd wanneer Conservatieve rasterisatie niet is ingeschakeld.

Interactie tussen opvulmodi

De enige geldige D3D12_FILL_MODE voor conservatieve rasterisatie is D3D12_FILL_SOLID, elke andere vulmodus is een ongeldige parameter voor de Rasterizer-status.

Dit komt doordat de functionele specificatie van D3D12 aangeeft dat de draadmodelvulmodus driehoeksranden moet converteren naar lijnen en de regels voor lijnrasterisatie moet volgen en het conservatieve gedrag van lijnrastering niet is gedefinieerd.

Implementatiedetails

Het type raster dat wordt ondersteund in Direct3D 12, wordt soms 'Overschattingated Conservative Rasterization' genoemd. Er is ook het concept 'Onderschat conservatieve rasterisering', wat betekent dat alleen pixels die volledig worden gedekt door een gerenderde primitieve, worden gerasterd. Onderschatte conservatieve rasterisatie-informatie is beschikbaar via de pixel-shader door het gebruik van invoerdekkingsgegevens, en alleen overschat conservatieve rasterisatie is beschikbaar als rastermodus.

Als een deel van een primitieve overlapt een pixel, wordt die pixel beschouwd als bedekt en wordt deze vervolgens gerasterd. Wanneer een rand of hoek van een primitief langs de rand of hoek van een pixel valt, is de toepassing van de 'regel linksboven' implementatiespecifiek. Voor implementaties die ondersteuning bieden voor degenerate driehoeken, moet een degenerate driehoek langs een rand of hoek echter ten minste één pixel bedekken.

Conservatieve rasterisatie-implementaties kunnen variëren op verschillende hardware en produceren fout-positieven, wat betekent dat ze ten onrechte kunnen beslissen dat pixels worden gedekt. Dit kan gebeuren vanwege implementatiespecifieke details, zoals primitieve groeiende of vastgemaakte fouten die inherent zijn aan de vast puntpuntcoördinaten die worden gebruikt in rastervorming. De reden dat fout-positieven (met betrekking tot hoekpuntcoördinaten met vaste punten) geldig zijn, is omdat er een aantal fout-positieven nodig zijn om een implementatie een dekkingsevaluatie uit te voeren op nagelijnde hoekpunten (d.w. hoekpuntcoördinaten die zijn geconverteerd van drijvende komma naar het vaste punt 16,8 dat in de rasterizer wordt gebruikt), maar de dekking die wordt geproduceerd door de oorspronkelijke drijvendekommapuntcoördinaten.

Conservatieve rasteriseringsimplementaties produceren geen fout-negatieven met betrekking tot de drijvendekommapuntcoördinaten voor niet-degenererende post-snap primitieven: als een deel van een primitieve deel van een pixel overlapt, wordt die pixel gerasterd.

Driehoeken die ontaard zijn (dubbele indexindexen in een indexbuffer of csvear in 3D) of worden ontaard na een conversie met vaste punten (collinseaire hoekpunten in de rasterizer), mogen of niet worden afgeruimd; beide zijn geldig gedrag. Degenererende driehoeken moeten worden beschouwd als ruggezicht, dus als een specifiek gedrag wordt vereist door een toepassing, kan het achtergezicht worden geruimd of getest op voorzijde. Degenereerde driehoeken gebruiken de waarden die zijn toegewezen aan Hoekpunt 0 voor alle geïnterpoleerde waarden.

Er zijn drie lagen hardwareondersteuning, naast de mogelijkheid dat de hardware deze functie niet ondersteunt.

  • Laag 1 dwingt een maximaal 1/2 pixel onzekerheid gebied af en biedt geen ondersteuning voor post-snap degenerates. Dit is handig voor het weergeven van tegels, een patroonatlas, het genereren van lichte kaarten en schaduwkaarten van sub pixel.
  • Laag 2 vermindert de maximale onzekerheid tot 1/256 en vereist dat post-snap degenerates niet worden afgeruimd. Deze laag is handig voor op CPU gebaseerde algoritmeversnelling (zoals voxelization).
  • Laag 3 onderhoudt een maximaal 1/256 onzekerheidsregio en voegt ondersteuning toe voor binneninvoerdekking. Binneninvoerdekking voegt de nieuwe waarde SV_InnerCoverage toe aan HLSL (High Level Shading Language). Dit is een 32-bits scalair geheel getal dat kan worden opgegeven bij invoer voor een pixel-shader en vertegenwoordigt de onderschatte conservatieve rasterisatie-informatie (dat wil gezegd, of een pixel gegarandeerd is-to-be-volledig bedekt). Deze laag is handig voor occlusie-afruiming.

API-samenvatting

De volgende methoden, structuren, opsommingen en helperklassen verwijzen naar Conservatieve rasterisering:

Zelfstudies voor geavanceerde trainingsvideo's voor DirectX: Conservatieve rasterisering

Rasterizer geordende weergaven

Rendering-