Dela via


Geometriskuggningssteg

GS-fasen (Geometry-Shader) kör programspecifik skuggningskod med hörn som indata och möjlighet att generera hörn på utdata.

Geometriskuggaren

Till skillnad från hörnskuggor, som fungerar på ett enda hörn, är geometriskuggarens indata hörnen för en fullständig primitiv (två hörn för linjer, tre hörn för trianglar eller ett hörn för punkt). Geometriska skuggningar kan också ta in hörndata för de kantnära primitiverna som indata (ytterligare två hörn för en linje, ytterligare tre för en triangel). Följande bild visar en triangel och en linje med intilliggande hörn.

bild av en triangel och en linje med intilliggande hörn

Typ
TV- Triangelhörn
AV Intilliggande hörn
LV- Linjehörn

 

Geometri-skuggningssteget kan förbruka det SV_PrimitiveID systemgenererade värdet som genereras automatiskt av IA. Detta gör att per primitiva data kan hämtas eller beräknas om så önskas.

Geometri-skuggningssteget kan mata ut flera hörn som bildar en enda vald topologi (tillgängliga GS-stegutdatatopologier är: tristrip, linestrip och pointlist). Antalet primitiver som genereras kan variera fritt inom valfritt anrop av geometriskuggaren, även om det maximala antalet hörn som kan avges måste deklareras statiskt. Bandlängder som genereras från en geometrisk skuggning kan vara godtyckliga och nya remsor kan skapas via funktionen RestartStrip HLSL.

Geometriska skuggningsutdata kan matas till rastreringssteget och/eller till en brytpunktsbuffert i minnet via strömutdatasteget. Utdata som matas till minnet expanderas till enskilda punkt-/linje-/triangellistor (exakt som de skulle skickas till rastreringen).

När en geometriskuggning är aktiv anropas den en gång för varje primitiv som skickades eller genererades tidigare i pipelinen. Varje anrop av geometriskuggaren ser som indata för den anropande primitiven, oavsett om det är en enda punkt, en enda rad eller en enda triangel. En triangelremsa från tidigare i pipelinen skulle resultera i ett anrop av geometriskuggaren för varje enskild triangel i remsan (som om remsan expanderades ut till en triangellista). Alla indata för varje hörn i den enskilda primitiven är tillgängliga (dvs. 3 hörn för triangel), plus intilliggande hörndata om tillämpligt/tillgängligt.

En geometrisk skuggning matar ut data ett hörn i taget genom att lägga till hörn till ett utdataströmobjekt. Topologin för strömmarna bestäms av en fast deklaration som väljer en av: PointStream, LineStream eller TriangleStream som utdata för GS-fasen. Det finns tre typer av stream-objekt tillgängliga, PointStream, LineStream och TriangleStream som alla är mallade objekt. Topologin för utdata bestäms av deras respektive objekttyp, medan formatet för hörnen som läggs till i dataströmmen bestäms av malltypen. Körningen av en geometriskuggningsinstans är atomisk från andra anrop, förutom att data som läggs till i strömmarna är seriell. Utdata från ett givet anrop av en geometriskuggning är oberoende av andra anrop (även om ordningen respekteras). En geometrisk skuggning som genererar triangelremsor startar en ny remsa på varje anrop.

När en geometrisk skuggning identifieras som ett systemtolkat värde (t.ex. SV_RenderTargetArrayIndex eller SV_Position) tittar maskinvaran på dessa data och utför ett visst beteende som är beroende av värdet, förutom att kunna skicka själva data till nästa skuggningssteg för indata. När sådana datautdata från geometriskuggningen har betydelse för maskinvaran per primitiv basis (till exempel SV_RenderTargetArrayIndex eller SV_ViewportArrayIndex), i stället för per hörn (till exempel SV_ClipDistance[n] eller SV_Position), tas per primitiva data från det inledande hörn som genereras för primitiven.

Delvis slutförda primitiver kan genereras av geometriskuggaren om geometriskuggaren slutar och primitiven är ofullständig. Ofullständiga primitiver ignoreras tyst. Detta liknar hur IA behandlar delvis slutförda primitiver.

Geometriskuggaren kan utföra belastnings- och struktursamplingsåtgärder där skärmutrymmesderivat inte krävs (samplelevel, samplecmplevelzero, samplegrad).

Algoritmer som kan implementeras i geometriskuggningen är:

  • Punkt sprite-expansion
  • Dynamiska partikelsystem
  • Päls/fin generation
  • Generering av skuggvolym
  • Översikt över återgivning till kub med enkel pass
  • Per-Primitive materialväxling
  • Per-Primitive materialinstallation – Inklusive generering av barycentriska koordinater som primitiva data så att en pixelskuggning kan utföra anpassad attributinterpolation (ett exempel på normal interpolering i högre ordning finns i CubeMapGS-exempel).

Grafikpipeline

pipelinesteg (Direct3D 10)