Schattierung mit variabler Rate (VRS)
Aufgrund von Leistungseinschränkungen kann es sich ein Grafikrenderer nicht immer leisten, für jeden Teil des Ausgabebilds das gleiche Qualitätsniveau zu liefern. Bei der Schattierung mit variabler Rate oder grober Pixelschattierung handelt es sich um einen Mechanismus, mit dem Sie die Renderingleistung und -leistung in Raten zuordnen können, die in Ihrem gerenderten Bild variieren.
In einigen Fällen kann die Schattierungsrate mit einer geringen oder keiner Verringerung der wahrnehmbaren Ausgabequalität reduziert werden; führt zu einer Leistungsverbesserung, die im Wesentlichen kostenlos ist.
Ohne Schattierung variabler Raten ist das einzige Mittel zur Steuerung der Schattierungsrate das Multi-Sample Anti-Aliasing (MSAA) mit samplebasierter Ausführung (auch als Supersampling bezeichnet).
MSAA ist ein Mechanismus zum Reduzieren geometrischer Aliasings und zur Verbesserung der Renderingqualität eines Bilds im Vergleich zur Nicht-Verwendung von MSAA. Die MSAA-Stichprobenanzahl, die 1x, 2x, 4x, 8x oder 16x sein kann, bestimmt die Anzahl der Stichproben, die pro Renderzielpixel zugeordnet sind. Die ANZAHL der MSAA-Stichproben muss im Voraus bekannt sein, wenn das Ziel zugeordnet ist, und sie kann danach nicht mehr geändert werden.
Das Supersampling bewirkt, dass der Pixelshader einmal pro Beispiel aufgerufen wird, bei einer höheren Qualität, aber auch höheren Leistungskosten im Vergleich zur Ausführung pro Pixel.
Ihre Anwendung kann die Schattierungsrate steuern, indem Sie zwischen der pro Pixel basierenden Ausführung oder MSAA-mit-supersampling wählen. Diese beiden Optionen bieten keine sehr feine Kontrolle. Außerdem können Sie eine niedrigere Schattierungsrate für eine bestimmte Klasse von Objekten im Vergleich zum Rest des Bilds verwenden. Solche Objekte können ein Objekt hinter einem HUD-Element oder eine Transparenz, eine Unschärfe (Tiefenschärfe, Bewegung usw.) oder eine optische Verzerrung aufgrund von VR-Optiken umfassen. Aber das wäre nicht möglich, da die Schattierungsqualität und die Kosten über das gesamte Bild festgelegt sind.
Das VRS-Modell (Variable Rate Shading) erweitert supersampling-with-MSAA in die entgegengesetzte Richtung , "grobes Pixel", indem das Konzept der groben Schattierung hinzugefügt wird. Hier kann die Schattierung mit einer Frequenz durchgeführt werden, die größer als ein Pixel ist. Anders ausgedrückt: Eine Gruppe von Pixeln kann als einzelne Einheit schattiert werden, und das Ergebnis wird dann an alle Beispiele in der Gruppe übertragen.
Mit einer Grobschattierungs-API kann Ihre Anwendung die Anzahl von Pixeln angeben, die zu einer schattierten Gruppe oder zu einem groben Pixel gehören. Sie können die ungefähre Pixelgröße variieren, nachdem Sie das Renderziel zugeordnet haben. Daher können verschiedene Teile des Bildschirms oder unterschiedliche Zeichnungsdurchläufe unterschiedliche Schattierungsraten aufweisen.
Im Folgenden finden Sie eine Tabelle, die beschreibt, welche MSAA-Ebene mit welcher groben Pixelgröße für Plattformen unterstützt wird, die eine grobe Schattierung unterstützen:
- Für Zellen, die mit Y gekennzeichnet sind, ist diese Kombination aktiviert.
- Für Zellen, die mit Cap gekennzeichnet sind, ist diese Kombination bedingt aktiviert, basierend auf einer Obergrenze (AdditionalShadingRatesSupported).
- Für zellen, die leer sind, wird diese Kombination nicht unterstützt.
- Für Zellen, die halbtonschattiert sind, wird diese Kombination nicht unterstützt, und sie umfasst die Nachverfolgung von mehr als 16 Stichproben pro Pixel-Shaderaufruf. Für die Nachverfolgung von mehr als 16 Beispielen müssen im Vergleich zu den anderen Fällen zusätzliche Hardwareausrichtungsbarrieren unterstützt werden.
Es gibt zwei Ebenen für die VRS-Implementierung und zwei Funktionen, die Sie abfragen können. Jede Ebene wird nach der Tabelle ausführlicher beschrieben.
- Die Schattierungsrate kann nur pro Zeichnung angegeben werden; nicht präziser als das.
- Die Schattierungsrate wird einheitlich auf das angewendet, was unabhängig davon gezeichnet wird, wo es sich innerhalb des Renderziels befindet.
- Die Schattierungsrate kann pro Ziehung angegeben werden, wie in Ebene 1. Sie kann auch durch eine Kombination von Pro-Draw-Basis und von angegeben werden:
- Semantik aus jedem provozierenden Scheitelpunkt und
- ein Bildschirmraumbild.
- Die Schattierungsraten aus den drei Quellen werden mithilfe einer Reihe von Kombinatoren kombiniert.
- Die Größe der Bildkachel im Bildschirmbereich beträgt mindestens 16 x 16.
- Die von Ihrer Anwendung angeforderte Schattierungsrate wird garantiert genau geliefert (für die Genauigkeit von temporalen und anderen Rekonstruktionsfiltern).
- SV_ShadingRate PS-Eingabe wird unterstützt.
- Die Schattierungsrate pro Provoking-Vertex (auch als pro-primitive Bezeichnet) ist gültig, wenn ein Viewport verwendet wird und
SV_ViewportArrayIndex
nicht in geschrieben wird. - Die provozierende Vertexrate kann mit mehr als einem Viewport verwendet werden, wenn die SupportsPerVertexShadingRateWithMultipleViewports-Funktion auf
true
festgelegt ist. Darüber hinaus kann in diesem Fall diese Rate verwendet werden, wennSV_ViewportArrayIndex
in geschrieben wird.
-
AdditionalShadingRatesSupported
- Boolescher Typ.
- Gibt an, ob die Pixelgrößen 2x4, 4x2 und 4x4 für das Rendering mit einzelnen Stichproben unterstützt werden; und gibt an, ob die grobe Pixelgröße 2x4 für 2x MSAA unterstützt wird.
-
SupportsPerVertexShadingRateWithMultipleViewports
- Boolescher Typ.
- Gibt an, ob mehr als ein Viewport mit der Schattierungsrate pro Vertex (auch bekannt als pro Grundtyp) verwendet werden kann.
Für die Flexibilität in Anwendungen gibt es eine Vielzahl von Mechanismen, um die Schattierungsrate zu steuern. Je nach Hardwarefeatureebene stehen verschiedene Mechanismen zur Verfügung.
Dies ist der einfachste Mechanismus zum Festlegen der Schattierungsrate. Es ist auf allen Ebenen verfügbar.
Ihre Anwendung kann mithilfe der ID3D12GraphicsCommandList5::RSSetShadingRate-Methode eine grobe Pixelgröße angeben. Diese API akzeptiert ein einzelnes Enumerationsargument. Die API bietet eine allgemeine Kontrolle über die Qualität des Renderings– die Möglichkeit, die Schattierungsrate pro Zeichnung festzulegen.
Werte für diesen Zustand werden durch die D3D12_SHADING_RATE-Enumeration ausgedrückt.
Die Schattierungsraten 1x1, 1x2, 2x1 und 2x2 werden auf allen Ebenen unterstützt.
Es gibt die Funktion AdditionalShadingRatesSupported, um anzugeben, ob 2x4, 4x2 und 4x4 auf dem Gerät unterstützt werden.
Auf Ebene 2 und höher können Sie die Pixelschattierungsrate mit einem Bildschirmabstandsbild angeben.
Mit dem Bildschirmraumbild kann Ihre Anwendung ein LoD-Bild (Level-of-Detail Mask) erstellen, das Bereiche mit unterschiedlicher Qualität angibt, z. B. Bereiche, die von Bewegungsunschärfe, Tiefenschärfe, transparenten Objekten oder HUD-UI-Elementen abgedeckt werden. Die Auflösung des Bilds befindet sich in Makroblocks; sie befindet sich nicht in der Auflösung des Renderziels. Anders ausgedrückt: Die Daten zur Schattierungsrate werden mit einer Granularität von 8x8- oder 16x16-Pixel-Kacheln angegeben, wie durch die VRS-Kachelgröße angegeben.
Ihre Anwendung kann eine API abfragen, um die unterstützte VRS-Kachelgröße für ihr Gerät abzurufen.
Kacheln sind quadratisch, und die Größe bezieht sich auf die Breite oder Höhe der Kachel in Texels.
Wenn die Hardware keine Schattierung mit variabler Rate der Ebene 2 unterstützt, gibt die Funktionsabfrage für die Kachelgröße 0 zurück.
Wenn die Hardware die Schattierung variabler Raten der Ebene 2 unterstützt, ist die Kachelgröße einer dieser Werte.
- 8
- 16
- 32
Für ein Renderziel der Größe {rtWidth, rtHeight}, das eine bestimmte Kachelgröße namens VRSTileSize verwendet, ist das Bildschirmraumbild, das es abdeckt, von diesen Dimensionen.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
Das Bild des Bildschirmbereichs oben links (0, 0) ist am oberen linken Rand des Renderziels (0, 0) gesperrt.
Um die (x,y)-Koordinate einer Kachel zu suchen, die einer bestimmten Position im Renderziel entspricht, dividieren Sie die Fensterraumkoordinaten von (x, y) durch die Kachelgröße, wobei Bruchbits ignoriert werden.
Wenn das Bildschirmraumbild größer ist als es für ein bestimmtes Renderziel sein muss, werden die zusätzlichen Teile rechts und/oder unten nicht verwendet.
Wenn das Bildschirmraumbild für ein bestimmtes Renderziel zu klein ist, ergibt jeder Versuch, das Bild über die tatsächlichen Ausdehnungen hinaus zu lesen, eine Standardschattierungsrate von 1x1. Dies liegt daran, dass das Bild des Bildschirmraums oben links (0, 0) am oberen linken Rand des Renderziels (0, 0) gesperrt ist, und "Lesen über die Renderzielausdehnungen hinaus" bedeutet, dass werte für x und y zu groß gelesen werden.
Das Format dieser Oberfläche ist eine einkanalige 8-Bit-Oberfläche (DXGI_FORMAT_R8_UINT).
Die Ressource ist die Dimension TEXTURE2D.
Es kann nicht arrayed oder mipped werden. Sie muss explizit eine MIP-Ebene aufweisen.
Es weist die Stichprobenanzahl 1 und die Stichprobenqualität 0 auf.
Es verfügt über das Texturlayout UNKNOWN. Es kann implizit kein Zeilen-Hauptlayout sein, da der Kreuzadapter nicht zulässig ist.
Die erwartete Art und Weise, wie die Bilddaten im Bildschirmbereich aufgefüllt werden, besteht darin,
- Schreiben Sie die Daten mithilfe eines Compute-Shaders. das Bildschirmraumbild als UAV gebunden ist, oder
- Kopieren Sie die Daten in das Bildschirmraumbild.
Beim Erstellen des Bildschirmraumbilds sind diese Flags zulässig.
- Keine
- ALLOW_UNORDERED_ACCESS
- DENY_SHADER_RESOURCE
Diese Flags sind nicht zulässig.
- ALLOW_RENDER_TARGET
- ALLOW_DEPTH_STENCIL
- ALLOW_CROSS_ADAPTER
- ALLOW_SIMULTANEOUS_ACCESS
- VIDEO_DECODE_REFERENCE_ONLY
Der Heaptyp der Ressource kann weder UPLOAD noch READBACK sein.
Die Ressource kann nicht SIMULTANEOUS_ACCESS werden. Die Ressource darf nicht adapterübergreifend sein.
Jedes Byte des Bildschirmraumbilds entspricht einem Wert der D3D12_SHADING_RATE-Enumeration .
Eine Ressource muss in einen schreibgeschützten Zustand übergehen, wenn sie als Bildschirmraumbild verwendet wird. Zu diesem Zweck wird ein schreibgeschützter Zustand D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE definiert.
Die Bildressource wird aus diesem Zustand überwechselt, um wieder beschreibbar zu werden.
Das Bildschirmraumbild zum Angeben der Shaderrate wird in der Befehlsliste festgelegt.
Eine Ressource, die als Quelle für die Schattierungsrate festgelegt wurde, kann aus keiner Shaderphase gelesen oder geschrieben werden.
Zum null
Angeben der Shaderrate kann ein Bildschirmraumbild festgelegt werden. Dies hat den Effekt, dass 1x1 konsistent als Beitrag aus dem Bildschirmraumbild verwendet wird. Das Bild des Bildschirmraums kann zunächst als auf null
festgelegt betrachtet werden.
Eine Bildschirmraum-Bildressource hat keine besonderen Auswirkungen auf die Heraufstufung oder den Verfall.
Ein pro primitives Attribut fügt die Möglichkeit hinzu, einen Begriff der Schattierungsrate als Attribut aus einem provozierenden Scheitelpunkt anzugeben. Dieses Attribut ist flachschattiert, d. h. es wird an alle Pixel im aktuellen Dreieck oder Liniengrundtyp weitergegeben. Die Verwendung eines pro primitiven Attributs kann eine präzisere Kontrolle der Bildqualität im Vergleich zu den anderen Schattierungsratespezifizierern ermöglichen.
Das pro primitive Attribut ist eine setzbare Semantik mit dem Namen SV_ShadingRate
.
SV_ShadingRate
als Teil des HLSL-Shadermodells 6.4 vorhanden.
Wenn ein VS oder GS festgelegt SV_ShadingRate
ist, VRS jedoch nicht aktiviert ist, hat die semantische Einstellung keine Auswirkung. Wenn kein Wert für SV_ShadingRate
pro Primitiv angegeben wird, wird ein Wert der Schattierungsrate von 1x1 als pro primitiver Beitrag angenommen.
Die verschiedenen Quellen der Schattierungsrate werden mit diesem Diagramm nacheinander angewendet.
Jedes Paar von A und B wird mit einem Kombinierer kombiniert.
* Wenn Sie eine Shaderrate nach Vertex-Attribut angeben.
- Wenn ein Geometrie-Shader verwendet wird, kann damit die Schattierungsrate angegeben werden.
- Wenn kein Geometrie-Shader verwendet wird, wird die Schattierungsrate durch den provozierenden Scheitelpunkt angegeben.
Die folgenden Kombinierer werden unterstützt. Verwenden sie einen Combiner (C) und zwei Eingaben (A und B).
- Passthrough. C.xy = A.xy.
- Überschreiben. C.xy = B.xy.
- Höhere Qualität. C.xy = min(A.xy, B.xy).
- Niedrigere Qualität. C.xy = max(A.xy, B.xy).
- Wenden Sie Kosten B relativ zu A an. C.xy = min(maxRate, A.xy + B.xy).
wobei maxRate
die größte zulässige Dimension von groben Pixeln auf dem Gerät ist. Dies wäre
-
D3D12_AXIS_SHADING_RATE_2X (d. h. ein Wert von 1), wenn AdditionalShadingRatesSupported ist
false
. -
D3D12_AXIS_SHADING_RATE_4X (d. h. ein Wert von 2), wenn AdditionalShadingRatesSupported ist
true
.
Die Auswahl des Kombinationsanbieters für Schattierung mit variabler Rate wird in der Befehlsliste über ID3D12GraphicsCommandList5::RSSetShadingRate festgelegt.
Wenn keine Kombinatoren festgelegt sind, bleiben sie bei der Standardeinstellung, also PASSTHROUGH.
Wenn die Quelle für einen Kombinierer eine D3D12_AXIS_SHADING_RATE ist, die in der Supporttabelle nicht zulässig ist, wird die Eingabe auf eine unterstützte Schattierungsrate saniert.
Wenn die Ausgabe eines Combiners nicht einer auf der Plattform unterstützten Schattierungsrate entspricht, wird das Ergebnis in eine unterstützte Schattierungsrate saniert.
Alle Quellen der Schattierungsrate, nämlich
- die vom Pipelinestatus angegebene Rate (in der Befehlsliste angegeben),
- die bildspezifische Rate des Bildschirmraums und
- das pro primitive Attribut
der Standardwert D3D12_SHADING_RATE_1X1 ist. Die Standardkombinatoren sind {PASSTHROUGH, PASSTHROUGH}.
Wenn kein Bild für den Bildschirmraum angegeben wird, wird von dieser Quelle eine Schattierungsrate von 1x1 abgeleitet.
Wenn kein pro primitives Attribut angegeben wird, wird aus dieser Quelle eine Schattierungsrate von 1x1 abgeleitet.
ID3D12CommandList::ClearState setzt die durch den Pipelinezustand angegebene Rate auf den Standardwert zurück, und die Auswahl des Bildschirmraumbilds auf die Standardeinstellung "kein Bildschirmraumbild".
Es ist nützlich zu wissen, welche Schattierungsrate von der Hardware bei einem beliebigen Pixelshaderaufruf ausgewählt wurde. Dies könnte eine Vielzahl von Optimierungen in Ihrem PS-Code ermöglichen. Die reine PS-Systemvariable , SV_ShadingRate
stellt Informationen zur Schattierungsrate bereit.
Der Typ dieser Semantik ist uint.
Die Daten werden als Wert der D3D12_SHADING_RATE-Enumeration interpretiert.
Wenn keine grobe Pixelschattierung verwendet wird, wird als SV_ShadingRate
Wert von 1x1 zurückgelesen, der auf feine Pixel hinweist.
Ein Pixel-Shader schlägt bei der Kompilierung fehl, wenn er eingabet SV_ShadingRate
und auch die beispielbasierte Ausführung verwendet, z. B. durch Eingabe SV_SampleIndex
oder mithilfe der Beispielinterpolation Schlüsselwort (keyword).
Hinweise zur verzögerten Schattierung
Die Lichtdurchläufe einer verzögerten Schattierungsanwendung müssen möglicherweise wissen, welche Schattierungsrate für welchen Bereich des Bildschirms verwendet wurde. Dies ist so, dass Lichtdurchgangssendungen mit einer gröberen Geschwindigkeit starten können. Die
SV_ShadingRate
Variable kann dazu verwendet werden, wenn sie in den gbuffer geschrieben wird.
Wenn grobe Pixelschattierung verwendet wird, werden Tiefe, Schablone und Abdeckung immer berechnet und mit der vollständigen Beispielauflösung ausgegeben.
Für alle Ebenen wird erwartet, dass, wenn eine Schattierungsrate angefordert wird und für die Kombination von Gerät und MSAA-Ebene unterstützt wird, dies die von der Hardware bereitgestellte Schattierungsrate ist.
Eine angeforderte Schattierungsrate bedeutet eine Schattierungsrate, die als Ausgabe der Kombinatoren berechnet wird (siehe Abschnitt Kombinieren von Schattierungsratesfaktoren in diesem Thema).
Eine unterstützte Schattierungsrate ist 1x1, 1x2, 2x1 oder 2x2 in einem Renderingvorgang, bei dem die Stichprobenanzahl kleiner oder gleich vier ist. Wenn die Funktion AdditionalShadingRatesSupported lautet true
, werden auch 2x4, 4x2 und 4x4 Schattierungsraten für einige Beispielanzahlen unterstützt (siehe Tabelle im Abschnitt Mit Variable-Rate-Schattierung (VRS) in diesem Thema).
Berechnungen von Pixel-zu-Benachbarten Pixelverläufen werden durch grobe Pixelschattierung beeinflusst. Wenn beispielsweise 2 x 2 grobe Pixel verwendet werden, ist ein Farbverlauf doppelt so groß wie bei nicht verwendeten groben Pixeln. Ihre Anwendung kann Shader anpassen, um dies zu kompensieren – je nach gewünschter Funktionalität.
Da mips basierend auf einer Bildschirmraum-Ableitung ausgewählt werden, wirkt sich die Verwendung der groben Pixelschattierung auf die Mip-Auswahl aus. Die Verwendung von grober Pixelschattierung führt dazu, dass weniger detaillierte Mips ausgewählt werden, als wenn keine groben Pixel verwendet werden.
Eingaben in einen Pixelshader können basierend auf ihren Quellvertices interpoliert werden. Da sich die Schattierung mit variabler Rate auf die Bereiche des Ziels auswirkt, die von jedem Aufruf des Pixelshaders geschrieben werden, interagiert sie mit der Attributinterpolation. Die drei Interpolationstypen sind center, centroid und sample.
Die mittlere Interpolationsposition für ein grobes Pixel ist der geometrische Mittelpunkt des vollständigen groben Pixelbereichs.
SV_Position
wird immer in der Mitte des groben Pixelbereichs interpoliert.
Wenn die grobe Pixelschattierung mit MSAA verwendet wird, gibt es für jedes feine Pixel weiterhin Schreibvorgänge auf die vollständige Anzahl von Stichproben, die für die MSAA-Ebene des Ziels zugeordnet sind. Daher berücksichtigt die Interpolationsposition des Schwerpunkts alle Stichproben für feine Pixel innerhalb von groben Pixeln. Allerdings wird der Schwerpunktinterpolationsstandort als die erste abgedeckte Stichprobe in erhöhter Reihenfolge des Stichprobenindexes definiert. Die effektive Abdeckung des Beispiels ist AND-ed mit dem entsprechenden Bit des Rasterizerzustands SampleMask.
Hinweis
Wenn die grobe Pixelschattierung auf Ebene 1 verwendet wird, ist SampleMask immer eine vollständige Maske. Wenn SampleMask nicht als vollständige Maske konfiguriert ist, ist die grobe Pixelschattierung auf Ebene 1 deaktiviert.
Beispielbasierte Ausführung oder Supersampling– die durch die Verwendung der Beispielinterpolationsfunktion verursacht wird – kann mit grober Pixelschattierung verwendet werden und bewirkt, dass der Pixelshader pro Stichprobe aufgerufen wird. Für Ziele der Stichprobenanzahl N wird der Pixelshader N-mal pro feinem Pixel aufgerufen.
Intrinsische Pullmodells sind nicht mit grober Pixelschattierung auf Ebene 1 kompatibel. Wenn versucht wird, intrinsische Pullmodells mit grober Pixelschattierung auf Ebene 1 zu verwenden, wird die grobe Pixelschattierung automatisch deaktiviert.
Das systeminterne EvaluateAttributeSnapped
darf mit grober Pixelschattierung auf Ebene 2 verwendet werden. Seine Syntax ist die gleiche wie immer.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
Für kontext EvaluateAttributeSnapped
hat einen Offsetparameter mit zwei Feldern. Bei Verwendung ohne grobe Pixelschattierung werden nur die vier Bits in niedrigerer Reihenfolge aus den vollständigen 2unddreißig verwendet. Diese vier Bits stellen den Bereich [-8, 7] dar. Dieser Bereich umfasst ein Raster von 16 x 16 innerhalb eines Pixels. Der Bereich ist so, dass der obere und linke Rand des Pixels eingeschlossen sind, und der untere und rechte Rand nicht. Offset (-8, -8) befindet sich in der oberen linken Ecke, und der Offset (7, 7) befindet sich in der unteren rechten Ecke. Offset (0, 0) ist die Mitte des Pixels.
Bei Verwendung mit grober Pixelschattierung EvaluateAttributeSnapped
kann der Offsetparameter von einen größeren Bereich von Speicherorten angeben. Der Offsetparameter wählt für jedes feine Pixel ein Raster von 16 x 16 aus, und es gibt mehrere feine Pixel. Der expressible Bereich und die daraus resultierende Anzahl der verwendeten Bits hängen von der groben Pixelgröße ab. Der obere und linke Rand des groben Pixels sind eingeschlossen, der untere und der rechte Rand nicht.
In der folgenden Tabelle wird die Interpretation des EvaluateAttributeSnapped
Offsetparameters für jede grobe Pixelgröße beschrieben.
Grobe Pixelgröße | Indizierbarer Bereich | Größe des darstellbaren Bereichs | Anzahl der benötigten Bits {x, y} | Binäre Maske von verwendbaren Bits |
---|---|---|---|---|
1x1 (fein) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {00000000000000xxxxxx, 0000000000000xxxx} |
1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {00000000000000xxxx, 000000000000xxxxx} |
2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {0000000000000xxxxx, 0000000000000xxxx} |
2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {000000000000xxxxx, 000000000000xxxxx} |
2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {000000000000xxxxx, 00000000000xxxxxxxx} |
4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {00000000000xxxxxxxx, 000000000000xxxxx} |
4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {000000000000xxxxxxxx, 0000000000xxxxxx} |
Die folgenden Tabellen sind eine Anleitung für die Konvertierung von der Festen In-Dezimal- und Bruchdarstellung. Das erste verwendbare Bit in der binären Maske ist das Vorzeichenbit, und der Rest der binären Maske umfasst den numerischen Teil.
Das Zahlenschema für Vier-Bit-Werte, die an übergeben werden, EvaluateAttributeSnapped
ist nicht spezifisch für die Schattierung mit variabler Rate. Es wird hier aus Gründen der Vollständigkeit wiederholt.
Für Vier-Bit-Werte.
Binärwert | Decimal | Bruchteil |
---|---|---|
1000 | -0,5f | -8 / 16 |
1001 | -0.4375f | -7 / 16 |
1010 | -0.375f | -6 / 16 |
1011 | -0.3125f | -5 / 16 |
1100 | -0,25f | -4 / 16 |
1101 | -0.1875f | -3 / 16 |
1110 | -0.125f | -2 / 16 |
1111 | -0,0625f | -1 /16 |
0000 | 0.0f | 0 / 16 |
0001 | -0,0625f | 1 / 16 |
0010 | -0.125f | 2 / 16 |
0011 | -0.1875f | 3 / 16 |
0100 | -0,25f | 4 / 16 |
0101 | -0.3125f | 5 / 16 |
0110 | -0.375f | 6 / 16 |
0111 | -0.4375f | 7 / 16 |
Für Fünf-Bit-Werte.
Binärwert | Decimal | Bruchteil |
---|---|---|
10000 | -1 | -16 / 16 |
10001 | -0.9375 | -15 / 16 |
10010 | -0.875 | -14 / 16 |
10011 | -0.8125 | -13 / 16 |
10100 | -0.75 | -12 / 16 |
10101 | -0.6875 | -11 / 16 |
10110 | -0.625 | -10 / 16 |
10111 | -0.5625 | -9 / 16 |
11000 | –0,5 | -8 / 16 |
11001 | -0.4375 | -7 / 16 |
11010 | -0.375 | -6 / 16 |
11011 | -0.3125 | -5 / 16 |
11100 | -0.25 | -4 / 16 |
11101 | -0.1875 | -3 / 16 |
11110 | -0.125 | -2 / 16 |
11111 | -0.0625 | -1 / 16 |
00000 | 0 | 0 / 16 |
00001 | 0.0625 | 1 / 16 |
00010 | 0,125 | 2 / 16 |
00011 | 0.1875 | 3 / 16 |
00100 | 0,25 | 4 / 16 |
00101 | 0.3125 | 5 / 16 |
00110 | 0.375 | 6 / 16 |
00111 | 0.4375 | 7 / 16 |
01000 | 0.5 | 8 / 16 |
01001 | 0.5625 | 9 / 16 |
01010 | 0.625 | 10 / 16 |
01011 | 0.6875 | 11 / 16 |
01100 | 0,75 | 12 / 16 |
01101 | 0.8125 | 13 / 16 |
01110 | 0.875 | 14 / 16 |
01111 | 0.9375 | 15 / 16 |
Für Sechs-Bit-Werte.
Binärwert | Decimal | Bruchteil |
---|---|---|
100.000 | -2 | -32 / 16 |
100001 | -1.9375 | -31 / 16 |
100010 | -1.875 | -30 / 16 |
100011 | -1.8125 | -29 / 16 |
100100 | -1.75 | -28 / 16 |
100101 | -1.6875 | -27 / 16 |
100110 | -1.625 | -26 / 16 |
100111 | -1.5625 | -25 / 16 |
101000 | -1.5 | -24 / 16 |
101001 | -1.4375 | -23 / 16 |
101010 | -1.375 | -22 / 16 |
101011 | -1.3125 | -21 / 16 |
101100 | -1.25 | -20 / 16 |
101101 | -1.1875 | -19 / 16 |
101110 | -1.125 | -18 / 16 |
101111 | -1.0625 | -17 / 16 |
110000 | -1 | -16 / 16 |
110001 | -0.9375 | -15 / 16 |
110010 | -0.875 | -14 / 16 |
110011 | -0.8125 | -13 / 16 |
110100 | -0.75 | -12 / 16 |
110101 | -0.6875 | -11 / 16 |
110110 | -0.625 | -10 / 16 |
110111 | -0.5625 | -9 / 16 |
111000 | –0,5 | -8 / 16 |
111001 | -0.4375 | -7 / 16 |
111010 | -0.375 | -6 / 16 |
111011 | -0.3125 | -5 / 16 |
111100 | -0.25 | -4 / 16 |
111101 | -0.1875 | -3 / 16 |
111110 | -0.125 | -2 / 16 |
111111 | -0.0625 | -1 / 16 |
000000 | 0 | 0 / 16 |
000001 | 0.0625 | 1 / 16 |
000010 | 0,125 | 2 / 16 |
000011 | 0.1875 | 3 / 16 |
000100 | 0,25 | 4 / 16 |
000101 | 0.3125 | 5 / 16 |
000110 | 0.375 | 6 / 16 |
000111 | 0.4375 | 7 / 16 |
001000 | 0.5 | 8 / 16 |
001001 | 0.5625 | 9 / 16 |
001010 | 0.625 | 10 / 16 |
001011 | 0.6875 | 11 / 16 |
001100 | 0,75 | 12 / 16 |
001101 | 0.8125 | 13 / 16 |
001110 | 0.875 | 14 / 16 |
001111 | 0.9375 | 15 / 16 |
010000 | 1 | 16 / 16 |
010001 | 1.0625 | 17 / 16 |
010010 | 1,125 | 18 / 16 |
010011 | 1.1875 | 19 / 16 |
010100 | 1,25 | 20 / 16 |
010101 | 1.3125 | 21 / 16 |
010110 | 1.375 | 22 / 16 |
010111 | 1.4375 | 23 / 16 |
011000 | 1.5 | 24 / 16 |
011001 | 1.5625 | 25 / 16 |
011010 | 1,625 | 26 / 16 |
011011 | 1.6875 | 27 / 16 |
011100 | 1,75 | 28 / 16 |
011101 | 1.8125 | 29 / 16 |
011110 | 1.875 | 30 / 16 |
011111 | 1.9375 | 31 / 16 |
Auf die gleiche Weise wie bei feinen Pixeln EvaluateAttributeSnapped
wird das Raster der auswertbaren Positionen in der groben Pixelmitte zentriert, wenn die grobe Pixelschattierung verwendet wird.
Wenn die API ID3D12GraphicsCommandList1::SetSamplePositions mit grober Schattierung verwendet wird, legt die API die Beispielpositionen für feine Pixel fest.
Wenn SV_Coverage
als Shadereingabe oder -ausgabe auf Ebene 1 deklariert wird, ist die grobe Pixelschattierung deaktiviert.
Sie können die SV_Coverage
Semantik mit grober Pixelschattierung auf Ebene 2 verwenden, und sie gibt an, welche Beispiele eines MSAA-Ziels geschrieben werden.
Wenn eine grobe Pixelschattierung verwendet wird, sodass mehrere Quellpixel aus einer Kachel bestehen können, stellt die Abdeckungsmaske alle Beispiele dar, die von dieser Kachel stammen.
Aufgrund der Kompatibilität der groben Pixelschattierung mit MSAA kann die Anzahl der zu angebenden Abdeckungsbits variieren. Bei einer 4-fachen MSAA-Ressource mit D3D12_SHADING_RATE_2x2 schreibt beispielsweise jedes grobe Pixel in vier feine Pixel, und jedes feine Pixel enthält vier Stichproben. Dies bedeutet, dass jedes grobe Pixel in insgesamt 4 * 4 = 16 Stichproben schreibt.
Die folgende Tabelle gibt an, wie viele Abdeckungsbits für jede Kombination aus grober Pixelgröße und MSAA-Ebene benötigt werden.
Wie in der Tabelle angegeben, ist es nicht möglich, mit groben Pixeln gleichzeitig in mehr als 16 Stichproben zu schreiben, indem die über Direct3D 12 verfügbar gemachte Schattierungsfunktion mit variabler Rate verwendet wird. Diese Einschränkung ist auf die Einschränkungen von Direct3D 12 in Bezug darauf zurückzuführen, welche MSAA-Ebenen mit welcher groben Pixelgröße zulässig sind (siehe Tabelle im Abschnitt Mit variabler Schattierung (VRS) in diesem Thema).
Die Bits der Abdeckungsmaske entsprechen einer klar definierten Reihenfolge. Die Maske besteht aus Abdeckungen von Pixeln von links nach rechts und dann von oben nach unten (Spalten-Haupt)-Reihenfolge. Coverage-Bits sind die Bits mit niedriger Reihenfolge der Abdeckungssemantik und sind dicht gepackt.
Die folgende Tabelle zeigt das Format der Abdeckungsmaske für unterstützte Kombinationen von grober Pixelgröße und MSAA-Ebene.
In der folgenden Tabelle sind 2 MSAA-Pixel dargestellt, wobei jedes Pixel zwei Stichproben der Indizes 0 und 1 enthält.
Die Positionierung der Beschriftungen von Stichproben auf den Pixeln dient zur Veranschaulichung und vermittelt nicht notwendigerweise die räumlichen {X, Y}-Speicherorte von Stichproben auf diesem Pixel; insbesondere, da die Beispielpositionen programmgesteuert geändert werden können. Beispiele werden durch ihren 0-basierten Index referenziert.
Die folgende Tabelle zeigt 4 MSAA-Pixel, wobei jedes Pixel vier Stichproben der Indizes 0, 1, 2 und 3 enthält.
Wenn die HLSL-Semantik discard
mit grober Pixelschattierung verwendet wird, werden grobe Pixel verworfen.
TIR wird nicht unterstützt, wenn eine grobe Pixelschattierung verwendet wird.
ROV-Interlocks werden als mit feiner Pixelgranularität ausgeführt. Wenn eine Schattierung pro Stichprobe durchgeführt wird, werden Interlocks mit der Stichprobengranularität ausgeführt.
Sie können die konservative Rasterung mit Schattierung mit variabler Rate verwenden. Wenn die konservative Rasterung mit grober Pixelschattierung verwendet wird, werden feine Pixel innerhalb von groben Pixeln vorsichtig gerastert, indem sie eine vollständige Abdeckung erhalten.
Wenn die konservative Rasterung verwendet wird, enthält die Abdeckungssemantik vollständige Masken für feine Pixel, die abgedeckt werden, und 0 für feine Pixel, die nicht abgedeckt sind.
Sie können Schattierungs-APIs mit variabler Rate für ein Bundle aufrufen.
Sie können Schattierungs-APIs mit variabler Rate in einem Renderdurchlauf aufrufen.
In diesem nächsten Abschnitt wird die Art und Weise beschrieben, auf die Für Ihre Anwendung über Direct3D 12 auf Schattierung mit variabler Rate zugegriffen werden kann.
Rufen Sie ID3D12Device::CheckFeatureSupport mit D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6 auf, um die Schattierungsfunktion mit variabler Rate abzufragen, und stellen Sie eine D3D12_FEATURE_DATA_D3D12_OPTIONS6 Struktur für die Funktion bereit, die Sie ausfüllen können. Die D3D12_FEATURE_DATA_D3D12_OPTIONS6-Struktur enthält mehrere Member, darunter eines vom aufgezählten Typ D3D12_VARIABLE_SHADING_RATE_TIER (D3D12_FEATURE_DATA_D3D12_OPTIONS6::VariableShadingRateTier) und eines, das angibt, ob die Hintergrundverarbeitung unterstützt wird (D3D12_FEATURE_DATA_D3D12_OPTIONS6::BackgroundProcessingSupported).
Wenn Sie z. B. die Funktion der Ebene 1 abfragen möchten, können Sie dies tun.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return
SUCCEEDED(m_device->CheckFeatureSupport(
D3D12_FEATURE_D3D12_OPTIONS6,
&options,
sizeof(options))) &&
options.ShadingRateTier == D3D12_VARIABLE_SHADING_RATE_TIER_1;
Die Werte in der D3D12_SHADING_RATE-Enumeration sind so organisiert, dass Schattierungsraten leicht in zwei Achsen zerlegt werden können, wobei die Werte jeder Achse gemäß der D3D12_AXIS_SHADING_RATE-Enumeration kompakt im logarithmischen Raum dargestellt werden.
Sie können ein Makro erstellen, um zwei Achsenschattierungsraten in eine Schattierungsrate wie diese zu erstellen.
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
D3D12_AXIS_SHADING_RATE_2X,
D3D12_AXIS_SHADING_RATE_1X)
Die Plattform stellt auch diese Makros bereit, die in definiert sind d3d12.h
.
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
Diese können verwendet werden, um zu dissekieren und zu verstehen SV_ShaderRate
.
Hinweis
Diese Dateninterpretation ist auf die Beschreibung des Bildschirmraumbilds ausgerichtet, das von Shadern bearbeitet werden kann. Dies wird in den obigen Abschnitten weiter erläutert. Es gibt jedoch keinen Grund, nicht über eine konsistente Definition der groben Pixelgrößen zu verfügen, die überall verwendet werden sollen, einschließlich beim Festlegen der Schattierungsrate auf Befehlsebene.
Die Schattierungsrate und optional Kombinatoren werden über die ID3D12GraphicsCommandList5::RSSetShadingRate-Methode angegeben. Sie übergeben einen D3D12_SHADING_RATE Wert für die Basisschattierungsrate und ein optionales Array von D3D12_SHADING_RATE_COMBINER Werten.
Der schreibgeschützte Ressourcenzustand, der ein verwendbares Schattierungsratenimage bezeichnet, wird als D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCE definiert.
Sie geben das Bildschirmraumbild über die ID3D12GraphicsCommandList5::RSSetShadingRateImage-Methode an.
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Sie können die Kachelgröße aus dem member D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize abfragen. Siehe Funktionsabfragen oben.
Eine Dimension wird abgerufen, da die horizontalen und vertikalen Dimensionen immer gleich sind. Wenn die Funktion des Systems D3D12_SHADING_RATE_TIER_NOT_SUPPORTED ist, ist die zurückgegebene Kachelgröße 0.