Delen via


Door het systeem gegenereerde waarden gebruiken

Door het systeem gegenereerde waarden worden gegenereerd door de IA-fase (Input Assemblyer) ( op basis van door de gebruiker geleverde invoersemantiek) om bepaalde efficiëntie in shader-bewerkingen mogelijk te maken. Door gegevens, zoals een instantie-id (zichtbaar voor de Vertex Shader (VS)-fase), een hoekpunt-id (zichtbaar voor de Vertex Shader (VS)), of een primitieve-id (zichtbaar voor de Geometrie Shader (GS)-fase/Pixel Shader (PS)-fase), kan een volgende shaderfase naar deze systeemwaarden zoeken om de verwerking in die fase te optimaliseren.

De VS-fase kan bijvoorbeeld zoeken naar de instance-ID om extra per-vertex gegevens te verzamelen voor de shader of om andere bewerkingen uit te voeren. De GS- en PS-fasen kunnen op dezelfde manier de primitive-ID gebruiken om per-primitive gegevens te verzamelen.

Hoekpunt-ID

Elke shaderfase gebruikt een hoekpunt-id om elk hoekpunt te identificeren. Het is een 32-bits geheel getal zonder teken waarvan de standaardwaarde 0 is. Het wordt toegewezen aan een hoekpunt (vertex) wanneer de primitieve wordt verwerkt door de Input Assembler (IA) fase. Koppel de vertex-ID-semantiek aan de invoerdeclaratie van de shader om de IA-fase te informeren over het genereren van een per-hoekpunt-ID.

De IA voegt een vertex-ID toe aan elk hoekpunt voor gebruik door shaderstages. Voor elke tekenoproep wordt de vertex-ID met 1 verhoogd. Bij geïndexeerde tekenoproepen wordt het aantal terug op de beginwaarde gezet. Als de hoekpunt-id overloopt (groter dan 2³²– 1), wrapt het naar 0.

Voor alle primitieve typen is er een hoekpunt-ID aan de hoekpunten gekoppeld (ongeacht aangrenzendheid).

PrimitiveID

Elke shader-fase gebruikt een primitieve ID om elke primitief te identificeren. Het is een 32-bits geheel getal zonder teken waarvan de standaardwaarde 0 is. Het wordt toegewezen aan een primitieve wanneer de primitieve wordt verwerkt door de Input Assemblyer (IA) fase. Om de IA-fase te informeren over het genereren van een primitieve ID, moet u de semantische primitieve ID koppelen aan de invoerdeclaratie van de shader.

De IA-fase voegt een primitieve ID toe aan elke primitieve voor gebruik door de Geometry Shader-fase (GS) of de Vertex Shader-fase (VS), afhankelijk van welke fase als eerste actief is na de IA-fase. Voor elke geïndexeerde tekenoproep wordt de Primitieve ID met 1 verhoogd, maar de Primitieve ID wordt opnieuw ingesteld op 0 wanneer een nieuw exemplaar begint. Alle andere aanroepen voor tekenen wijzigen de waarde van de exemplaar-id niet. Als de instantie-id overloopt (groter dan 2³²– 1), loopt deze terug tot 0.

De Pixel Shader-fase (PS) heeft geen afzonderlijke invoer voor een primitieve id; elke pixel-shader-invoer die een primitieve id specificeert, maakt echter gebruik van een constante interpolatiemodus.

Er is geen ondersteuning voor het automatisch genereren van een primitieve id voor aangrenzende primitieven. Voor primitieve typen met aangrenzen, zoals een driehoekstrook met aangrenzen, wordt een primitieve ID alleen onderhouden voor de interne primitieven (de niet-aangrenzende primitieven), net zoals bij de set primitieven in een driehoekstrook zonder aangrenzen.

InstantieID

Een exemplaar-id wordt door elke shader-fase gebruikt om het exemplaar van de geometrie te identificeren dat momenteel wordt verwerkt. Het is een 32-bits geheel getal zonder teken waarvan de standaardwaarde 0 is.

De Input Assembler (IA) fase zal een instance ID toevoegen aan elke vertex als de invoerdeclaratie van de vertex-shader de instance ID-semantiek bevat. Voor elke geïndexeerde tekenoproep wordt de instance-id verhoogd met 1. Alle andere tekenaanroepen wijzigen de waarde van de exemplaar-ID niet. Als de instantie-id overloopt (groter dan 2³²– 1), loopt deze terug tot 0.

voorbeeld

In de volgende afbeelding ziet u hoe systeemwaarden worden gekoppeld aan een geïnstantieerde driehoeksstrook in de Input Assembler (IA) fase.

afbeelding van systeemwaarden voor een driehoeksstrook

In deze tabellen worden de systeemwaarden weergegeven die zijn gegenereerd voor beide exemplaren van dezelfde driehoeksstrook. Het eerste exemplaar (instantie U) wordt blauw weergegeven, het tweede exemplaar (exemplaar V) wordt groen weergegeven. De ononderbroken lijnen verbinden de hoekpunten in de primitieve vormen, de stippellijnen verbinden de aangrenzende hoekpunten.

In de volgende tabellen worden de door het systeem gegenereerde waarden voor de instantie-U weergegeven.

Hoekpuntgegevens C, U D,U E,U F,U G,U H, U I, U J,U K,U L, U
HoekpuntID 0 1 2 3 4 5 6 7 8 9
InstanceID 0 0 0 0 0 0 0 0 0 0

 

Het driehoeksstrookexemplaren U heeft drie driehoeksprimitieven, met de volgende door het systeem gegenereerde waarden:

Waarde 1 Waarde 2 Waarde 3
PrimitiveID 0 1 2
InstanceID 0 0 0

 

In de volgende tabellen worden de door het systeem gegenereerde waarden voor het exemplaar V weergegeven.

Hoekpuntgegevens C, V D,V E, V F,V G,V H, V I, V J,V K, V L, V
HoekpuntID 0 1 2 3 4 5 6 7 8 9
InstanceID 1 1 1 1 1 1 1 1 1 1

 

Het driehoeksstrookexemplaren V heeft drie driehoeksprimitieven, met de volgende door het systeem gegenereerde waarden:

Waarde 1 Waarde 2 Waarde 3
PrimitiveID 0 1 2
InstanceID 1 1 1

 

De Input Assembler (IA)-fase genereert de ID's (hoekpunt, primitief en instantie); merk ook op dat elke instantie een unieke instantie-ID krijgt. De gegevens eindigen met de strooksnede, die elk exemplaar van de driehoeksstrook scheidt.

Input-Assembler (IA) fase