Semantiek
Een semantisch is een tekenreeks die is gekoppeld aan een shader-invoer of -uitvoer die informatie over het beoogde gebruik van een parameter overbrengt. Semantiek is vereist voor alle variabelen die worden doorgegeven tussen shader-fasen. De syntaxis voor het toevoegen van een semantische variabele aan een shadervariabele wordt hier weergegeven (Syntaxis van variabelen (DirectX HLSL)).
Over het algemeen zijn gegevens die worden doorgegeven tussen pijplijnfasen volledig algemeen en worden ze niet uniek geïnterpreteerd door het systeem; willekeurige semantiek zijn toegestaan die geen speciale betekenis hebben. Parameters (in Direct3D 10 en hoger) die deze speciale semantiek bevatten, worden aangeduid als System-Value Semantiek.
Semantiek ondersteund in Direct3D 9 en Direct3D 10 en hoger
De volgende typen semantiek worden ondersteund in zowel Direct3D 9 als Direct3D 10 en hoger.
- Seman tiek van hoekpunt arcering
- Semantiek van pixel-arcering
Hoekpunt arcering semantiek
Deze semantiek hebben betekenis wanneer ze zijn gekoppeld aan een hoekpunt-shaderparameter. Deze semantiek wordt ondersteund in zowel Direct3D 9 als Direct3D 10 en hoger.
Invoer | Beschrijving | Type |
---|---|---|
BINORMAL[n] | Binormaal | float4 |
BLENDINDICES[n] | Indexen combineren | uint |
BLENDWEIGHT[n] | Gewichten mengen | drijven |
COLOR[n] | Diffuse en speculatieve kleur | float4 |
NORMAL[n] | Normale vector | float4 |
POSITION[n] | Hoekpuntpositie in objectruimte. | float4 |
POSITIONT | Getransformeerde hoekpuntpositie. | float4 |
PSIZE[n] | Puntgrootte | drijven |
TANGENS[n] | Tangens | float4 |
TEXCOORD[n] | Patrooncoördinaten | float4 |
Uitvoer | Beschrijving | Type |
---|---|---|
COLOR[n] | Diffuse of speculatieve kleur | float4 |
MIST | Hoekpuntmist | drijven |
POSITION[n] | Positie van een hoekpunt in homogene ruimte. Rekenpositie in schermruimte door delen (x,y,z) door w. Elke hoekpunt-shader moet een parameter met deze semantische schrijfbewerking schrijven. OPMERKING: Dit semantisch is beschikbaar in Direct3D 9. Gebruik in plaats daarvan SV_Position voor Direct3D 10 en hoger. | float4 |
PSIZE | Puntgrootte | drijven |
TESSFACTOR[n] | Tessellation-factor | drijven |
n
is een optioneel geheel getal tussen 0 en het aantal ondersteunde resources. Bijvoorbeeld POSITION0, TEXCOORD1, enzovoort.
Semantiek van Pixel Shader
Deze semantiek hebben betekenis wanneer ze zijn gekoppeld aan een pixel-shader-invoerparameter. Deze semantiek wordt ondersteund in zowel Direct3D 9 als Direct3D 10 en hoger.
Invoer | Beschrijving | Type |
---|---|---|
COLOR[n] | Diffuse of speculatieve kleur. | float4 |
TEXCOORD[n] | Patrooncoördinaten | float4 |
VFACE | Scalaire drijvende komma die een back-facing primitieve aangeeft. Een negatieve waarde staat achterwaarts, terwijl een positieve waarde de camera aangeeft.
Opmerking: |
drijven |
VPOS | De pixellocatie (x,y) in de schermruimte. Zie Direct3D 9 VPOS en Direct3D 10 SV_Position) als u een Direct3D 9-arcering (die gebruikmaakt van deze semantische arcering) wilt converteren naar een Direct3D 10-arcering) | float2 |
Uitvoer | Beschrijving | Type |
---|---|---|
COLOR[n] | Uitvoerkleur | float4 |
DIEPTE[n] | Uitvoerdiepte | drijven |
n
is een optioneel geheel getal tussen 0 en het aantal ondersteunde resources. Bijvoorbeeld PSIZE0, COLOR1, enzovoort.
De semantische kleur is alleen geldig in de arceringsmodus (dat wil gezegd, wanneer de shader wordt gemaakt met behulp van D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY).
Semantiek wordt alleen ondersteund voor Direct3D 10 en hoger.
De volgende typen semantiek zijn nieuw geïntroduceerd voor Direct3D 10 en zijn niet beschikbaar voor Direct3D 9.
System-Value semantiek
Semantiek met systeemwaarden is nieuw voor Direct3D 10. Alle systeemwaarden beginnen met een SV_ voorvoegsel, een veelvoorkomend voorbeeld is SV_POSITION, wat wordt geïnterpreteerd door de rasterizerfase. De systeemwaarden zijn geldig in andere onderdelen van de pijplijn. SV_Position kan bijvoorbeeld worden opgegeven als invoer voor een hoekpunt- en uitvoer. Pixel-shaders kunnen alleen schrijven naar parameters met de SV_Depth en SV_Target semantiek van systeemwaarden.
Andere systeemwaarden (SV_VertexID, SV_InstanceID, SV_IsFrontFace) kunnen alleen worden ingevoerd in de eerste actieve arcering in de pijplijn die de specifieke waarde kan interpreteren; daarna moet de shader-functie de waarden doorgeven aan volgende fasen.
SV_PrimitiveID is een uitzondering op deze regel van alleen invoer in de eerste actieve arcering in de pijplijn die de specifieke waarde kan interpreteren; de hardware kan dezelfde id-waarde bieden als invoer voor de romp-shader-fase, domein-shader-fase en daarna de eerste ingeschakelde fase: geometrie-shader-fase of pixel-shader-fase.
Als tessellation is ingeschakeld, zijn de romp-shader-fase en domein-shader-fase aanwezig. Voor een bepaalde patch is dezelfde PrimitiveID van toepassing op de aanroep van de romp-shader van de patch en alle tessellated domain shader-aanroepen. Dezelfde PrimitiveID wordt ook doorgegeven aan de volgende actieve fase; geometrie-shader-fase of pixel-shader-fase indien ingeschakeld.
Als de geometrie-shader SV_PrimitiveID invoert en omdat deze nul of een of meer primitieven per aanroep kan uitvoeren, moet de shader zijn eigen keuze van SV_PrimitiveID waarde voor elke uitvoerprimitief programmeren als een volgende pixel-shader invoer SV_PrimtiveID.
Een ander voorbeeld is dat SV_PrimitiveID niet kan worden geïnterpreteerd door de hoekpunt-shaderfase, omdat een hoekpunt lid kan zijn van meerdere primitieven.
Deze semantiek is toegevoegd aan Direct3D 10; ze zijn niet beschikbaar in Direct3D 9.
Systeemwaarde-semantiek voor de rasterizerfase.
System-Value semantisch | Beschrijving | Type |
---|---|---|
SV_ClipDistance[n] | Afstandsgegevens van clip. SV_ClipDistance waarden worden uitgegaan van een float32-ondertekende afstand tot een vliegtuig. Primitieve installatie roept alleen rastervorming aan op pixels waarvoor de geïnterpoleerde vlakafstand(en) >= 0. Meerdere clipvlakken kunnen tegelijkertijd worden geïmplementeerd door meerdere onderdelen van een of meer hoekpuntelementen te declareren als de SV_ClipDistance. De gecombineerde waarden voor knip- en afstandsafstand zijn maximaal D3D#_CLIP_OR_CULL_DISTANCE_COUNT onderdelen in maximaal D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT registers. Beschikbaar voor alle shaders waarnaar moet worden gelezen of geschreven, behalve de hoekpunt-shader waarmee de waarde kan worden geschreven, maar niet als invoer. Het kenmerk clipvlakken werkt als SV_ClipDistance, maar werkt op alle hardware functieniveau 9_x en hoger. Zie Gebruikersclipvlakken op hardwareniveau 9 op functieniveau 9voor meer informatie. |
drijven |
SV_CullDistance[n] | Afstandsgegevens opruimen. Wanneer onderdelen van hoekpuntelement(en) dit label krijgen, wordt ervan uitgegaan dat deze waarden elk een float32-ondertekende afstand naar een vlak zijn. Primitieven worden volledig verwijderd als de vlakafstand(en) voor alle hoekpunten in de primitieve zijn < 0. Meerdere ruimvlakken kunnen tegelijkertijd worden gebruikt door meerdere componenten van een of meer hoekpuntelementen te declareren als de SV_CullDistance. De gecombineerde waarden voor knip- en afstandsafstand zijn maximaal D3D#_CLIP_OR_CULL_DISTANCE_COUNT onderdelen in maximaal D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT registers. Beschikbaar voor alle shaders waarnaar moet worden gelezen of geschreven, behalve de hoekpunt-shader waarmee de waarde kan worden geschreven, maar niet als invoer. |
drijven |
SV_Coverage | Een masker dat kan worden opgegeven voor invoer, uitvoer of beide van een pixel-shader. Voor SV_Coverage op een pixel-shader wordt UITVOER ondersteund op ps_4_1 of hoger. Voor SV_Coverage op een pixel-shader is voor INPUT ps_5_0 of hoger vereist. |
uint |
SV_Depth | Dieptebuffergegevens. Kan worden geschreven met pixel-shader. | drijven |
SV_DepthGreaterEqual | In een pixel-shader is uitvoerdiepte toegestaan, zolang deze groter is dan of gelijk is aan de waarde die wordt bepaald door de rasterizer. Hiermee schakelt u de diepte in zonder vroege Z uit te schakelen. | drijven |
SV_DepthLessEqual | In een pixel-shader staat u uitvoerdiepte toe, zolang deze kleiner is dan of gelijk is aan de waarde die wordt bepaald door de rasterizer. Hiermee schakelt u de diepte in zonder vroege Z uit te schakelen. | drijven |
SV_DispatchThreadID | Definieert de globale thread-offset binnen de dispatch-oproep, per dimensie van de groep. Beschikbaar als invoer voor compute-shader. (alleen-lezen) | uint3 |
SV_DomainLocation | Definieert de locatie op de romp van het huidige domeinpunt dat wordt geëvalueerd. Beschikbaar als invoer voor de domein-shader. (alleen-lezen) | float2|3 |
SV_GroupID | Definieert de groepsverschuiving binnen een dispatch-oproep, per dimensie van de verzendoproep. Beschikbaar als invoer voor de compute-shader. (alleen-lezen) | uint3 |
SV_GroupIndex | Biedt een platgemaakte index voor een bepaalde thread binnen een bepaalde groep. Beschikbaar als invoer voor de compute-shader. (alleen-lezen) | uint |
SV_GroupThreadID | Definieert de thread-offset binnen de groep, per dimensie van de groep. Beschikbaar als invoer voor de compute-shader. (alleen-lezen) | uint3 |
SV_GSInstanceID | Definieert het exemplaar van de geometrie-shader. Beschikbaar als invoer voor de geometrie-shader. Het exemplaar is nodig omdat een geometrie-shader maximaal 32 keer kan worden aangeroepen op dezelfde geometrie primitief. | uint |
SV_InnerCoverage | Vertegenwoordigt onderschatte conservatieve rasterisatie-informatie (d.w. of een pixel gegarandeerd is-to-be-volledig bedekt). Kan worden gelezen of geschreven door de pixel-shader. | |
SV_InsideTessFactor | Definieert de tesselatiehoeveelheid binnen een patchoppervlak. Beschikbaar in de romp-shader voor schrijven en beschikbaar in de domein-shader voor lezen. | float|float[2] |
SV_InstanceID | Id per exemplaar automatisch gegenereerd door de runtime (zie Using System-Generated Values (Direct3D 10)). Beschikbaar voor alle shaders. | |
SV_IsFrontFace | Hiermee geeft u op of een driehoek naar voren gericht is. Voor lijnen en punten heeft IsFrontFace de waarde waar. De uitzondering zijn lijnen die zijn getekend uit driehoeken (draadmodelmodus), waarmee IsFrontFace op dezelfde manier wordt ingesteld als het raster van het driehoekje in de ononderbroken modus. Kan worden geschreven naar de geometrie-shader en worden gelezen door de pixel-shader. | Bool |
SV_OutputControlPointID | Definieert de index van de controlepunt-id die wordt bediend door een aanroep van het hoofdinvoerpunt van de romp-shader. Kan alleen worden gelezen door de romp arcering. | uint |
SV_Position | Wanneer SV_Position wordt gedeclareerd voor invoer in een shader, kan er een van de twee interpolatiemodi worden opgegeven: linearNoPerspective of linearNoPerspectiveCentroid, waarbij de laatste ervoor zorgt dat de waarden van het zwaartepunt vastgelijnde xyzw worden opgegeven wanneer multisample antialiasing. Bij gebruik in een shader beschrijft SV_Position de pixellocatie. Beschikbaar in alle shaders om het pixelcentrum te krijgen met een offset van 0,5. | float4 |
SV_PrimitiveID | Per primitieve id automatisch gegenereerd door de runtime (zie Using System-Generated Values (Direct3D 10)). Kan worden geschreven naar de geometrie of pixel shaders, en worden gelezen door de geometrie, pixel, romp of domein shaders. | uint |
SV_RenderTargetArrayIndex | Matrixindex render-doel. Toegepast op de uitvoer van geometrie-shader en geeft het segment van de doelmatrix weer waarop de primitieve wordt getekend door de pixel-shader. SV_RenderTargetArrayIndex is alleen geldig als het renderdoel een matrixresource is. Dit semantisch geldt alleen voor primitieven; als een primitieve meer dan één hoekpunt heeft, wordt de waarde van het voorlooppunt gebruikt. Deze waarde geeft ook aan welk matrixsegment van een diepte-/stencilweergave wordt gebruikt voor lees-/schrijfdoeleinden. Kan worden geschreven vanuit de geometrie-shader en worden gelezen door de pixel-shader. Als D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer is true , wordt SV_RenderTargetArrayIndex toegepast op elke shader die de rasterizer invoert. |
uint |
SV_SampleIndex | Voorbeeldfrequentie-indexgegevens. Alleen beschikbaar om te worden gelezen of geschreven door de pixel-shader. | uint |
SV_StencilRef | Vertegenwoordigt de huidige pixel-shader-referentiewaarde voor het stencil. Kan alleen worden geschreven door de pixel-shader. | uint |
SV_Target[n], waarbij 0 <= n <= 7 | De uitvoerwaarde die wordt opgeslagen in een renderdoel. De index geeft aan naar welke van de 8 mogelijk afhankelijke renderdoelen moeten worden geschreven. De waarde is beschikbaar voor alle shaders. | float[2|3|4] |
SV_TessFactor | Definieert de tesselatiehoeveelheid aan elke rand van een patch. Beschikbaar voor schrijven in de romp-shader en lezen in de domein-shader. | float[2|3|4] |
SV_VertexID | Per hoekpunt-id automatisch gegenereerd door de runtime (zie System-Generated Waarden (Direct3D 10) gebruiken). Alleen beschikbaar als invoer voor de hoekpunt-shader. | uint |
SV_ViewportArrayIndex | Viewport-matrixindex. Toegepast op de arceringsuitvoer van geometrie en geeft aan welke viewport moet worden gebruikt voor de primitieve die momenteel wordt geschreven. Kan worden gelezen door de pixel-shader. De primitieve wordt getransformeerd en geknipt tegen de viewport die is opgegeven door de index voordat deze wordt doorgegeven aan de rasterizer. Dit semantisch geldt alleen voor primitieven; als een primitieve meer dan één hoekpunt heeft, wordt de waarde van het voorlooppunt gebruikt. Als D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer is true , wordt SV_ViewportArrayIndex toegepast op elke shader die de rasterizer invoert. |
uint |
SV_ShadingRate | Definieert, door middel van arceringsfrequentie waarden, het aantal pixels dat is geschreven door één pixel shader-aanroep voor variabele arceringsfrequentie laag 2 of hoger. Kan worden gelezen vanuit de pixel-shader. Kan worden geschreven vanuit een hoekpunt of geometrie-shader. | uint |
Beperkingen bij het schrijven van SV_Depth:
- Wanneer multisampling (MultisampleEnable is TRUE in D3D10_RASTERIZER_DESC) en het schrijven van een dieptewaarde (met behulp van een pixel-shader), wordt ook de enkele waarde gebruikt in de dieptetest; De mogelijkheid om primitieve randen met een hogere resolutie weer te geven, gaat dus verloren wanneer multisampling.
- Wanneer u dynamisch-stroombeheer gebruikt, is het onmogelijk om tijdens het compileren te bepalen of een shader die SV_Depth in sommige paden schrijft, gegarandeerd SV_Depth schrijft in elke uitvoering. Het schrijven van SV_Depth wanneer gedeclareerd resulteert in niet-gedefinieerd gedrag (wat wel of niet het verwijderen van de pixel kan omvatten).
- Elke float32-waarde, inclusief +/-INF en NaN, kan worden geschreven naar SV_Depth.
- Schrijven SV_Depth is nog steeds geldig bij het uitvoeren van Dual Source Color Blending.
Migratie van Direct3D 9 naar Direct3D 10 en hoger
De volgende problemen moeten worden overwogen bij het migreren van code van Direct3D 9 naar Direct3D 10 en hoger:
Toewijzing aan Direct3D 9 Semantiek
Een paar van de semantiek Direct3D 10 en hoger worden rechtstreeks toegewezen aan Direct3D 9-semantiek.
Direct3D 10 Semantisch | Direct3D 9 Equivalent Semantisch |
---|---|
SV_Depth | DIEPTE |
SV_Position | POSITIE |
SV_Target | KLEUR |
[!] Opmerking voor Direct3D 9-ontwikkelaars: Voor Direct3D 9-doelen moet de arceringsemantiek worden toegewezen aan geldige Direct3D 9-semantiek. Voor compatibiliteit met eerdere versies behandelt FXC POSITION0 (en de variantnamen) als SV_Position. FXC behandelt COLOR als SV_TARGET. DXC- en nieuwere compilers beschouwen POSITION[n] en COLOR als door de gebruiker gedefinieerde semantiek.
- toewijzen aan Direct3D 9-semantiek
- Direct3D 9 VPOS en Direct3D 10 SV_Position
- clipvlakken van gebruikers in HLSL-
Direct3D 9 VPOS en Direct3D 10 SV_Position
De Semantische D3D10-SV_Position biedt vergelijkbare functionaliteit als het Direct3D 9-shadermodel 3 VPOS semantisch. In Direct3D 9 wordt bijvoorbeeld de volgende syntaxis gebruikt voor een pixel-shader met behulp van schermruimtecoördinaten:
float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
// code here
}
VPOS is toegevoegd voor ondersteuning voor shader-model 3, om schermruimtecoördinaten op te geven, omdat de POSITION-semantische is bedoeld voor objectruimtecoördinaten.
In Direct3D 10 en hoger geeft de SV_Position semantisch (wanneer gebruikt in de context van een pixel-shader) schermruimtecoördinaten (offset met 0,5). Daarom zou de Direct3D 9-arcering ongeveer gelijk zijn (zonder rekening te hebben met de offset 0,5) op het volgende:
float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
// code here
}
Wanneer u migreert van Direct3D 9 naar Direct3D 10 en hoger, moet u hiervan op de hoogte zijn bij het vertalen van uw shaders.
Clipvlakken van gebruikers in HLSL
Vanaf Windows 8 kunt u het kenmerk clipvlakken functie gebruiken in een declaratie van hlSL--functie in plaats van SV_ClipDistance om ervoor te zorgen dat uw arcering werkt op functieniveau 9_x en functieniveau 10 en hoger. Zie Gebruikersclipvlakken op hardwareniveau 9 op functieniveau 9voor meer informatie.