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.
In de fase geometrie-shader (GS) wordt toepassingsspecifieke shadercode uitgevoerd met hoekpunten als invoer en de mogelijkheid om hoekpunten op uitvoer te genereren.
De Geometrie-arcering
In tegenstelling tot hoekpunt-shaders, die op één hoekpunt werken, zijn de ingangen van de geometrie-shader de hoekpunten voor een volledige primitieve (twee hoekpunten voor lijnen, drie hoekpunten voor driehoeken of één hoekpunt). Geometrie-shaders kunnen ook de hoekpuntgegevens voor de rand-aangrenzende primitieven als invoer invoeren (een extra twee hoekpunten voor een lijn, een extra drie voor een driehoek). In de volgende afbeelding ziet u een driehoek en een lijn met aangrenzende hoekpunten.
Type | |
---|---|
tv- | Driehoek hoekpunt |
AV- | Aangrenzend hoekpunt |
LV- | Lijnpunt |
De geometrie-shader-fase kan de SV_PrimitiveID door het systeem gegenereerde waarde verbruiken die automatisch wordt gegenereerd door de IA. Hierdoor kunnen per primitieve gegevens, indien gewenst, worden opgehaald of berekend.
De geometrie-shader-fase kan meerdere hoekpunten produceren die één geselecteerde topologie vormen (topologieën voor GS-faseuitvoer beschikbaar zijn: tristrip, linestrip en pointlist). Het aantal primitieven dat wordt uitgezonden, kan vrij variëren binnen elke aanroep van de geometrie-shader, hoewel het maximum aantal hoekpunten dat kan worden verzonden statisch moet worden gedeclareerd. Striplengten die worden verzonden vanuit een geometrie-shader kunnen willekeurig zijn en nieuwe stroken kunnen worden gemaakt via de RestartStrip HLSL-functie.
De geometrie-shader-uitvoer kan worden ingevoerd in de rasterizerfase en/of aan een hoekpuntbuffer in het geheugen via de stroomuitvoerfase. Uitvoer die naar het geheugen wordt verzonden, wordt uitgebreid naar afzonderlijke punt-/lijn-/driehoekslijsten (precies zoals ze worden doorgegeven aan de rasterizer).
Wanneer een geometrie-shader actief is, wordt deze eenmaal aangeroepen voor elke primitieve die eerder in de pijplijn is doorgegeven of gegenereerd. Elke aanroep van de geometrie-shader ziet als invoer van de gegevens voor het aanroepen van primitieven, ongeacht of dat een enkel punt, één lijn of één driehoek is. Een driehoeksstrook van eerder in de pijplijn zou resulteren in een aanroep van de geometrie-shader voor elke afzonderlijke driehoek in de strip (alsof de strip werd uitgevouwen in een driehoekslijst). Alle invoergegevens voor elk hoekpunt in de afzonderlijke primitieve zijn beschikbaar (bijvoorbeeld 3 hoekpunten voor driehoek), plus aangrenzende hoekpuntgegevens, indien van toepassing/beschikbaar.
Een geometrie-shader voert gegevens één hoekpunt tegelijk uit door hoekpunten toe te voegen aan een uitvoerstroomobject. De topologie van de streams wordt bepaald door een vaste declaratie, waarbij u een van: PointStream, LineStream of TriangleStream kiest als uitvoer voor de GS-fase. Er zijn drie typen stroomobjecten beschikbaar, PointStream, LineStream en TriangleStream, die allemaal objecten met sjabloon zijn. De topologie van de uitvoer wordt bepaald door hun respectieve objecttype, terwijl de indeling van de hoekpunten die aan de stroom worden toegevoegd, wordt bepaald door het sjabloontype. Uitvoering van een instantie van geometrie-shader is atomisch van andere aanroepen, behalve dat gegevens die aan de streams worden toegevoegd, serieel zijn. De uitvoer van een bepaalde aanroep van een geometrie-shader is onafhankelijk van andere aanroepen (hoewel volgorde wordt gerespecteerd). Een geometrie-shader die driehoekstrips genereert, begint bij elke aanroep een nieuwe strip.
Wanneer de uitvoer van een geometrie-shader wordt geïdentificeerd als een door het systeem geïnterpreteerde waarde (bijvoorbeeld SV_RenderTargetArrayIndex of SV_Position), kijkt hardware naar deze gegevens en wordt een bepaald gedrag uitgevoerd dat afhankelijk is van de waarde, naast dat de gegevens zelf kunnen worden doorgegeven aan de volgende arceringsfase voor invoer. Wanneer dergelijke gegevensuitvoer van de geometrie-shader betekent voor de hardware per primitieve basis (zoals SV_RenderTargetArrayIndex of SV_ViewportArrayIndex), in plaats van per hoekpunt (zoals SV_ClipDistance[n] of SV_Position), worden de per primitieve gegevens genomen uit het voorlooppunt dat wordt verzonden voor de primitieve.
Gedeeltelijk voltooide primitieven kunnen worden gegenereerd door de geometrie-shader als de geometrie-shader eindigt en de primitieve onvolledig is. Onvolledige primitieven worden op de achtergrond verwijderd. Dit is vergelijkbaar met de manier waarop de IA gedeeltelijk voltooide primitieven behandelt.
De geometrie-shader kan bewerkingen uitvoeren voor belastings- en textuursampling waarbij schermruimtederivaten niet vereist zijn (samplelevel, samplecmplevelzero, samplegrad).
Algoritmen die kunnen worden geïmplementeerd in de geometrie-shader zijn onder andere:
- Uitbreiding van puntspite
- Dynamische deeltjessystemen
- Fur/Fin Generation
- Schaduwvolumegeneratie
- Single Pass Render-to-Cubemap
- Per-Primitive materiaal wisselen
- Per-Primitive Materiaalinstallatie- Inclusief het genereren van barycentrische coördinaten als primitieve gegevens, zodat een pixel-shader aangepaste kenmerkinterpolatie kan uitvoeren (zie CubeMapGS Samplevoor een voorbeeld van normale interpolatie van hogere volgorde).
Verwante onderwerpen