Variable Schattierung (VRS)
Die Motivation für VRS
Aufgrund von Leistungsbeschränkungen kann sich ein Grafikrenderer nicht immer leisten, jedem Teil des Ausgabebilds das gleiche Qualitätsniveau zu bieten. Die Variable-Rate-Schattierung (oder grobe Pixelschattierung) ist ein Mechanismus, mit dem Sie renderingleistungs-/Leistungsraten zuweisen können, die in Ihrem gerenderten Bild variieren.
In einigen Fällen kann die Schattierungsrate mit geringem oder keinem Rückgang der wahrnehmbaren Ausgabequalität reduziert werden; führt zu einer Leistungsverbesserung, die im Wesentlichen kostenlos ist.
Ohne VRS – Multi-Sample Antialiasing mit Supersampling
Ohne Schattierung mit variabler Rate ist die einzige Möglichkeit zur Steuerung der Schattierungsrate mit Multi-Sample-Antialiasing (MSAA) mit beispielbasierter Ausführung (auch als Supersampling bezeichnet).
MSAA ist ein Mechanismus zum Reduzieren geometrischer Aliase und zur Verbesserung der Renderingqualität eines Bilds im Vergleich zur Verwendung von MSAA. Die MSAA-Beispielanzahl, die 1x, 2x, 4x, 8x oder 16x sein kann, bestimmt die Anzahl der pro Renderzielpixel zugewiesenen Beispiele. Die MSAA-Beispielanzahl muss vorab bekannt sein, wenn das Ziel zugewiesen wird, und es kann danach nicht mehr geändert werden.
Supersampling bewirkt, dass der Pixelshader einmal pro Beispiel aufgerufen wird, bei einer höheren Qualität, aber auch höheren Leistungskosten im Vergleich zur Pro-Pixel-Ausführung.
Ihre Anwendung kann die Schattierungsrate steuern, indem Sie zwischen der pro Pixel basierten 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 Objektklasse im Vergleich zum Rest des Bilds verwenden. Solche Objekte können ein Objekt hinter einem HUD-Element oder eine Transparenz, einen Weichzeichner (Tiefenfeld, Bewegung usw.) oder eine optische Verzerrung aufgrund von VR-Optiken enthalten. Das wäre aber nicht möglich, weil die Schattierungsqualität und die Kosten über das gesamte Bild fixiert sind.
Mit variabler Schattierung (VRS)
Das Modell mit variabler Schattierung (VRS) erweitert supersampling-with-MSAA in die entgegengesetzte, "grobe Pixel", Richtung, indem das Konzept der groben Schattierung hinzugefügt wird. Hier können Schattierungen mit einer Häufigkeit durchgeführt werden, die grober als ein Pixel ist. Mit anderen Worten, eine Gruppe von Pixeln kann als einzelne Einheit schattiert werden, und das Ergebnis wird dann an alle Beispiele in der Gruppe übertragen.
Mit einer groben Schattierungs-API kann Ihre Anwendung die Anzahl der Pixel angeben, die zu einer schattierten Gruppe gehören, oder groben Pixel. Sie können die grobe Pixelgröße variieren, nachdem Sie das Renderziel zugewiesen haben. Unterschiedliche Teile des Bildschirms oder unterschiedliche Zeichendurchläufe können also unterschiedliche Schattierungsraten aufweisen.
Es folgt eine Tabelle, in der beschrieben wird, welche MSAA-Ebene unterstützt wird, mit welcher groben Pixelgröße für Plattformen, die grobe Schattierung unterstützen:
- Bei Zellen, die Y-markiert sind, ist diese Kombination aktiviert.
- Bei Zellen, die Capmarkiert sind, ist diese Kombination bedingt basierend auf einer Obergrenze (AdditionalShadingRatesSupported) aktiviert.
- Bei leeren Zellen wird diese Kombination nicht unterstützt.
- Bei Zellen, die halbtonschattet sind, wird diese Kombination nicht unterstützt, und umfasst das Nachverfolgen von mehr als 16 Beispielen pro Pixelshaderaufruf. Für die Nachverfolgung von mehr als 16 Beispielen gibt es zusätzliche Hardwareausrichtungsbarrieren zur Unterstützung im Vergleich zu den anderen Fällen.
Featureebenen
Es gibt zwei Ebenen für die VRS-Implementierung und zwei Funktionen, nach denen Sie abfragen können. Jede Ebene wird nach der Tabelle ausführlicher beschrieben.
Ebene 1
- Die Schattierungsrate kann nur pro Draw-Basis angegeben werden; nicht präziser als das.
- Die Schattierungsrate gilt einheitlich für das, was unabhängig davon gezeichnet wird, wo sie sich innerhalb des Renderziels befindet.
Ebene 2
- Die Schattierungsrate kann auf gezeichneter Basis angegeben werden, wie in Stufe 1. Sie kann auch durch eine Kombination aus gezeichneter Basis und von:
- Semantik aus jedem provozieren Scheitelpunkt und
- ein Bildschirmbereichsbild.
- Schattierungsraten aus den drei Quellen werden mit einer Reihe von Kombinatoren kombiniert.
- Die Kachelgröße für Bildschirmfläche beträgt 16 x 16 oder kleiner.
- Die von Ihrer Anwendung angeforderte Schattierungsrate wird garantiert genau geliefert (für die Genauigkeit von zeitlichen und anderen Wiederaufbaufiltern).
- SV_ShadingRate PS-Eingabe wird unterstützt.
- Die Provoking-Vertex-Schattierungsrate (auch als Pro-Grundtyp bezeichnet) ist gültig, wenn ein Viewport verwendet wird und
SV_ViewportArrayIndex
nicht geschrieben wird. - Die Provoking-Vertexrate kann mit mehreren Viewports verwendet werden, wenn die SupportsPerVertexShadingRateWithMultipleViewports--Funktion auf
true
festgelegt ist. Darüber hinaus kann in diesem Fall diese Rate verwendet werden, wennSV_ViewportArrayIndex
geschrieben wird.
Liste der Funktionen
-
AdditionalShadingRatesSupported
- Boolescher Typ.
- Gibt an, ob 2x4, 4x2 und 4x4 grobe Pixelgrößen für das Rendern mit einer Stichprobe unterstützt werden; und ob grobe Pixelgröße 2x4 für 2x MSAA unterstützt wird.
-
SupportsPerVertexShadingRateWithMultipleViewports
- Boolescher Typ.
- Gibt an, ob mehrere Viewports mit der Schattierungsrate pro Vertex (auch als pro Grundtyp bezeichnet) verwendet werden können.
Angeben der Schattierungsrate
Für Flexibilität bei Anwendungen gibt es eine Vielzahl von Mechanismen zur Steuerung der Schattierungsrate. Je nach Hardwarefeatureebene stehen verschiedene Mechanismen zur Verfügung.
Befehlsliste
Dies ist der einfachste Mechanismus zum Festlegen der Schattierungsrate. Es ist auf allen Ebenen verfügbar.
Ihre Anwendung kann eine grobe Pixelgröße mithilfe der ID3D12GraphicsCommandList5::RSSetShadingRate Methodeangeben. Diese API verwendet ein einzelnes Enumerationsargument. Die API bietet eine allgemeine Kontrolle über die Qualität des Renderings – die Möglichkeit, die Schattierungsrate pro Draw-Basis festzulegen.
Werte für diesen Zustand werden durch die D3D12_SHADING_RATE-Aufzählung ausgedrückt.
Unterstützung für grobe Pixelgröße
Die Schattierungsraten 1x1, 1x2, 2x1 und 2x2 werden auf allen Ebenen unterstützt.
Es gibt eine Funktion, AdditionalShadingRatesSupported, um anzugeben, ob 2x4, 4x2 und 4x4 auf dem Gerät unterstützt werden.
Bildschirmbereichsbild (bildbasiert)
Auf Ebene 2 und höher können Sie die Pixelschattierungsrate mit einem Bildschirmraumbild angeben.
Mit dem Bildschirmbereichsbild kann Ihre Anwendung ein "LOD-Maskenformat (Level-of-Detail) erstellen, das Bereiche unterschiedlicher Qualität angibt, z. B. Bereiche, die durch Bewegungsunschärfe, Tiefen-of-Field-Weichzeichner, transparente Objekte oder HUD-UI-Elemente abgedeckt werden. Die Auflösung des Bilds befindet sich in Makroblocks; es befindet sich nicht in der Auflösung des Renderziels. Anders ausgedrückt, werden die Schattierungsratesdaten auf einer Granularität von 8x8- oder 16 x 16-Pixel-Kacheln angegeben, wie durch die VRS-Kachelgröße angegeben.
Kachelgröße
Ihre Anwendung kann eine API abfragen, um die unterstützte VRS-Kachelgröße für sein Gerät abzurufen.
Kacheln sind quadratisch, und die Größe bezieht sich auf die Breite oder Höhe der Kachel in Texeln.
Wenn die Hardware die Variable-Rate-Schattierung der Ebene 2 nicht unterstützt, gibt die Funktionsabfrage für die Kachelgröße 0 zurück.
Wenn die Hardware- die Variable-Rate-Schattierung der Ebene 2 unterstützt, ist die Kachelgröße einer dieser Werte.
- 8
- 16
- 32
Bildgröße des Bildschirmbereichs
Für ein Renderziel der Größe {rtWidth, rtHeight}, unter Verwendung einer bestimmten Kachelgröße mit dem Namen VRSTileSize, ist das Bildschirmbereichsbild, das es abdecken wird, von diesen Dimensionen.
{ ceil((float)rtWidth / VRSTileSize), ceil((float)rtHeight / VRSTileSize) }
Die obere linke Ecke des Bildschirmbereichsbilds (0, 0) ist links oben (0, 0) für das Renderziel gesperrt.
Um die (x,y)-Koordinate einer Kachel nachzuschlagen, die einer bestimmten Position im Renderziel entspricht, dividieren Sie die Fensterraumkoordinaten von (x, y) durch die Kachelgröße, wobei Bruchbits ignoriert werden.
Wenn das Bildschirmbereichsbild größer als für ein bestimmtes Renderziel sein muss, werden die zusätzlichen Teile rechts und/oder unten nicht verwendet.
Wenn das Bildschirmbereichsbild für ein bestimmtes Renderziel zu klein ist, führt jedes versuchte Lesen aus dem Bild über seine tatsächlichen Ausmaße hinaus zu einer standardmäßigen Schattierungsrate von 1x1. Dies liegt daran, dass die obere linke Bildschirmfläche (0, 0) am oberen linken Rand (0, 0) des Renderziels gesperrt ist und "über das Renderziel hinaus gelesen wird" bedeutet, dass zu große Werte für x und y gelesen werden.
Format, Layout, Ressourceneigenschaften
Das Format dieser Oberfläche ist eine 8-Bit-Oberfläche mit einem Kanal (DXGI_FORMAT_R8_UINT).
Die Ressource ist dimensioniert TEXTURE2D.
Es kann nicht arrayiert oder verippt werden. Er muss explizit eine Mip-Ebene aufweisen.
Es enthält die Stichprobenanzahl 1 und die Beispielqualität 0.
Es verfügt über ein Texturlayout UNKNOWN. Es kann implizit kein Zeilen-Hauptlayout sein, da cross-adapter nicht zulässig ist.
Die erwartete Art und Weise, in der die Bilddaten im Bildschirmbereich aufgefüllt werden, besteht in beiden
- Schreiben Sie die Daten mit einem Compute-Shader; das Bildschirmbereichsbild als UAV gebunden ist oder
- Kopieren Sie die Daten in das Bildschirmbereichsbild.
Beim Erstellen des Bildschirmbereichsbilds sind diese Flags zulässig.
- NICHTS
- 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.
Daten
Jedes Byte des Bildschirmbereichsbilds entspricht einem Wert der D3D12_SHADING_RATE Enumeration.
Ressourcenstatus
Eine Ressource muss in einen schreibgeschützten Zustand übertragen werden, wenn sie als Bildschirmraumbild verwendet wird. Zu diesem Zweck wird ein schreibgeschützter Zustand D3D12_RESOURCE_STATE_SHADING_RATE_SOURCEdefiniert.
Die Bildressource wird aus diesem Zustand umgestellt, um wieder beschreibbar zu werden.
Festlegen des Bilds
Das Bildschirmbereichsbild zum Angeben der Shaderrate wird in der Befehlsliste festgelegt.
Eine Ressource, die als Schattierungsratesquelle festgelegt wurde, kann nicht aus einer Shaderstufe gelesen oder geschrieben werden.
Ein null
Bildschirmbereichsbild kann zum Angeben der Shaderrate festgelegt werden. Dies hat die Auswirkung, dass 1x1 konsistent als Beitrag des Bildschirmraumbilds verwendet wird. Das Bildschirmbereichsbild kann zunächst als auf null
festgelegt werden.
Förderung und Verfall
Eine Bildressource im Bildschirmbereich hat keine besonderen Auswirkungen auf die Heraufstufung oder den Verfall.
Pro Grundtyp-Attribut
Ein primitives Attribut fügt die Möglichkeit hinzu, einen Schattierungsratenausdruck als Attribut aus einem provozierenden Scheitelpunkt anzugeben. Dieses Attribut ist flach schattiert , d. h. an alle Pixel im aktuellen Dreieck oder Liniengrundtyp verteilt. Die Verwendung eines grundtypspezifischen Attributs kann eine präzisere Kontrolle der Bildqualität im Vergleich zu den anderen Schattierungsratenbezeichnern ermöglichen.
Das Attribut pro Grundtyp ist eine settable Semantik mit dem Namen SV_ShadingRate
.
SV_ShadingRate
ist als Teil HLSL-Shadermodell 6.4vorhanden.
Wenn ein VS oder GS SV_ShadingRate
festlegt, VRS jedoch nicht aktiviert ist, hat die semantische Einstellung keine Auswirkung. Wenn kein Wert für SV_ShadingRate
pro Grundtyp angegeben wird, wird als Grundtypbeitrag ein Schattierungssatzwert von 1x1 angenommen.
Kombinieren von Schattierungsratenfaktoren
Die verschiedenen Quellen der Schattierungsrate werden mithilfe dieses Diagramms sequenziert angewendet.
Jedes Paar von A und B wird mit einem Kombinationsregler kombiniert.
* Beim Angeben einer Shaderrate nach Vertex-Attribut.
- Wenn ein Geometrie-Shader verwendet wird, kann die Schattierungsrate dadurch angegeben werden.
- Wenn kein Geometrie-Shader verwendet wird, wird die Schattierungsrate durch den provozierenden Vertex angegeben.
Liste der Kombinatoren
Die folgenden Kombinationskombinationen werden unterstützt. Verwenden eines Combiners (C) und zweier Eingaben (A und B).
- Passthrough. C.xy = A.xy.
- Außerkraftsetzen. 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).
- Kosten B relativ zu Aanwenden. C.xy = min(maxRate, A.xy + B.xy).
dabei ist maxRate
die größte zulässige Dimension von groben Pixeln auf dem Gerät. Dies wäre
-
D3D12_AXIS_SHADING_RATE_2X (d. h. ein Wert von 1), wenn AdditionalShadingRatesSupported
false
ist. -
D3D12_AXIS_SHADING_RATE_4X (d. h. ein Wert von 2), wenn AdditionalShadingRatesSupported
true
ist.
Die Wahl des Combiners für die Schattierung mit variabler Rate wird in der Befehlsliste über ID3D12GraphicsCommandList5::RSSetShadingRatefestgelegt.
Wenn keine Kombinatoren festgelegt werden, bleiben sie bei der Standardeinstellung, also PASSTHROUGH.
Wenn es sich bei der Quelle für einen Combiner um eine D3D12_AXIS_SHADING_RATEhandelt, die in der Supporttabelle nicht zulässig ist, wird die Eingabe auf eine Schattierungsrate sanitiert, die unterstützt wird.
Wenn die Ausgabe eines Kombinationsgebers nicht einer auf der Plattform unterstützten Schattierungsrate entspricht, wird das Ergebnis in einer Schattierungsrate geordnet, die unterstützt wird.
Standardstatus und Status löschen
Alle Schattierungsratenquellen, nämlich alle Schattierungsratenquellen
- die angegebene Pipelinestatusrate (in der Befehlsliste angegeben),
- die angegebene Bildrate des Bildschirmbereichs und
- das Pro-Grundtyp-Attribut
haben einen Standardwert von D3D12_SHADING_RATE_1X1. Die Standardkombinationen sind {PASSTHROUGH, PASSTHROUGH}.
Wenn kein Bildschirmraumbild angegeben ist, wird eine Schattierungsrate von 1x1 von dieser Quelle abgeleitet.
Wenn kein primitives Attribut angegeben wird, wird eine Schattierungsrate von 1x1 von dieser Quelle abgeleitet.
ID3D12CommandList::ClearState setzt die durch den Pipelinestatus angegebene Rate auf die Standardeinstellung zurück, und die Auswahl des Bildschirmbereichsbilds auf die Standardeinstellung "kein Bildschirmraumbild".
Abfragen der Schattierungsrate mithilfe von SV_ShadingRate
Es ist hilfreich, zu wissen, welche Schattierungsrate von der Hardware bei jedem bestimmten Pixelshaderaufruf ausgewählt wurde. Dies könnte eine Vielzahl von Optimierungen in Ihrem PS-Code ermöglichen. Eine PS-only-Systemvariable, SV_ShadingRate
, stellt Informationen zur Schattierungsrate bereit.
Art
Der Typ dieser Semantik ist uint.
Dateninterpretation
Die Daten werden als Wert der D3D12_SHADING_RATE Enumeration interpretiert.
Wenn VRS nicht verwendet wird
Wenn keine grobe Pixelschattierung verwendet wird, wird SV_ShadingRate
als Wert von 1x1 zurückgelesen, der feine Pixel angibt.
Verhalten unter beispielbasierter Ausführung
Ein Pixelshader schlägt die Kompilierung fehl, wenn er SV_ShadingRate
eingibt und auch beispielbasierte Ausführung verwendet, z. B. durch Eingaben SV_SampleIndex
oder Verwenden des Beispielinterpolationsschlüsselworts.
Hinweise zur verzögerten Schattierung
Die Beleuchtung einer verzögerten Schattierungsanwendung muss möglicherweise wissen, welche Schattierungsrate für welchen Bildschirmbereich verwendet wurde. Dies ist so, dass beleuchtungsdurchgangene Verteiler mit einer groberen Rate starten können. Die
SV_ShadingRate
Variable kann verwendet werden, um dies zu erreichen, wenn sie in den gbuffer geschrieben wird.
Tiefe und Schablone
Wenn grobe Pixelschattierung verwendet wird, werden Tiefe und Schablone und Abdeckung bei der vollständigen Beispielauflösung immer berechnet und ausgegeben.
Verwenden der angeforderten Schattierungsrate
Für alle Ebenen wird erwartet, dass, wenn eine Schattierungsrate angefordert wird und auf der Geräte- und MSAA-Ebene-Kombination unterstützt wird, dann die Schattierungsrate, die von der Hardware bereitgestellt wird.
Eine angeforderte Schattierungsrate bedeutet, dass eine Schattierungsrate, die als Ausgabe der Kombinatoren berechnet wird (siehe Kombinieren von Schattierungsratenfaktoren Abschnitt in diesem Thema).
Eine unterstützte Schattierungsrate beträgt 1x1, 1x2, 2x1 oder 2x2 in einem Renderingvorgang, bei dem die Beispielanzahl kleiner oder gleich vier ist. Wenn die AdditionalShadingRatesSupported--Funktion true
ist, werden 2x4, 4x2 und 4x4 auch Schattierungsraten für einige Beispielanzahlen unterstützt (siehe Tabelle in der Mit variabler Schattierung (VRS) Abschnitt in diesem Thema).
Bildschirmbereichsderivate
Berechnungen von Pixel-zu-angrenzenden Pixelverläufen werden durch grobe Pixelschattierung beeinflusst. Wenn z. B. 2 x 2 grobe Pixel verwendet werden, wird ein Farbverlauf doppelt so groß wie bei verwendung groben Pixeln. Ihre Anwendung kann Shader anpassen, um dies zu kompensieren – oder nicht, je nach gewünschter Funktionalität.
Da mips basierend auf einem Bildschirmraumderivate ausgewählt werden, wirkt sich die Verwendung grober Pixelschattierung auf die Mip-Auswahl aus. Die Verwendung von grober Pixelschattierung bewirkt, dass weniger detaillierte Mips ausgewählt werden, verglichen mit denen, wenn grobe Pixel nicht verwendet werden.
Attributinterpolation
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 Pixelshader geschrieben wurden, interagiert sie mit der Attributinterpolation. Die drei Arten der Interpolation sind zentrieren, zentrieren und proben.
Mitte
Die Mittelinterpolationsposition für ein grobes Pixel ist die geometrische Mitte des vollständig groben Pixelbereichs.
SV_Position
wird immer in der Mitte des groben Pixelbereichs interpoliert.
Schwerpunkt
Wenn grobe Pixelschattierung mit MSAA verwendet wird, werden für jedes feine Pixel immer noch Schreibvorgänge in die vollständige Anzahl von Beispielen für die MSAA-Ebene des Ziels zugewiesen. Daher berücksichtigt die Interpolationsposition des Schwerpunkts alle Beispiele für feine Pixel innerhalb grober Pixel. Das heißt, die Schwerpunkt-Interpolationsposition wird als erste abgedeckte Stichprobe definiert, wobei die Reihenfolge des Stichprobenindex erhöht wird. Die effektive Abdeckung des Beispiels wird mit dem entsprechenden Bit des Rasterizerzustands SampleMask and-eded.
Anmerkung
Wenn grobe Pixelschattierung auf Ebene 1 verwendet wird, ist SampleMask immer eine vollständige Maske. Wenn SampleMask so konfiguriert ist, dass es sich nicht um eine vollständige Maske handelt, wird die grobe Pixelschattierung auf Ebene 1 deaktiviert.
Beispielbasierte Ausführung
Beispielbasierte Ausführung oder Supersampling-, die durch die Verwendung des Beispielinterpolationsfeatures verursacht wird, kann mit grober Pixelschattierung verwendet werden und bewirkt, dass der Pixelshader pro Beispiel aufgerufen wird. Für Ziele der Beispielanzahl N wird der Pixelshader N mal pro feinem Pixel aufgerufen.
EvaluateAttributeSnapped
Systeminterne Pull-Modell sind nicht kompatibel mit grober Pixelschattierung auf Ebene 1. Wenn versucht wird, systeminterne Pull-Modell 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. Die Syntax ist identisch mit der Syntax, die schon immer war.
numeric EvaluateAttributeSnapped(
in attrib numeric value,
in int2 offset);
Für den Kontext weist EvaluateAttributeSnapped
einen Offsetparameter mit zwei Feldern auf. Bei Verwendung ohne grobe Pixelschattierung werden nur die vier Bits in der unteren Reihenfolge aus den vollen 300 Bits verwendet. Diese vier Bits stellen den Bereich [-8, 7] dar. Dieser Bereich erstreckt sich über ein Raster von 16 x 16 innerhalb eines Pixels. Der Bereich ist so, dass die oberen und linken Ränder des Pixels enthalten sind, und die unteren und rechten Ränder sind 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 kann EvaluateAttributeSnapped
Offsetparameter einen breiteren Bereich von Positionen angeben. Der Offsetparameter wählt ein Raster von 16 x 16 für jedes feine Pixel aus, und es gibt mehrere feine Pixel. Der ausdrucksfähige Bereich und die daraus resultierende Anzahl der verwendeten Bits hängt von der groben Pixelgröße ab. Die oberen und linken Ränder des groben Pixels sind enthalten, und die unteren und rechten Ränder sind nicht vorhanden.
In der folgenden Tabelle wird die Interpretation des Offsetparameters EvaluateAttributeSnapped
für jede grobe Pixelgröße beschrieben.
EvaluateAttributeSnappeds Offsetbereich
Grobe Pixelgröße | Indizierbarer Bereich | Darstellungsfähige Bereichsgröße | Anzahl der benötigten Bits {x, y} | Binäre Maske verwendbarer Bits |
---|---|---|---|---|
1x1 (Geldbuße) | {[-8, 7], [-8, 7]} | {16, 16} | {4, 4} | {00000000000xxxx, 000000000000xxxx} |
1x2 | {[-8, 7], [-16, 15]} | {16, 32} | {4, 5} | {00000000000xxxx, 00000000000xxxxx} |
2x1 | {[-16, 15], [-8, 7]} | {32, 16} | {5, 4} | {0000000000xxxxx, 00000000000xxxx} |
2x2 | {[-16, 15], [-16, 15]} | {32, 32} | {5, 5} | {0000000000xxxxx, 0000000000xxxxx} |
2x4 | {[-16, 15], [-32, 31]} | {32, 64} | {5, 6} | {0000000000xxxxx, 000000000xxxx} |
4x2 | {[-32, 31], [-16, 15]} | {64, 32} | {6, 5} | {000000000xxxxxx, 0000000000xxxxx} |
4x4 | {[-32, 31], [-32, 31]} | {64, 64} | {6, 6} | {000000000xxxxxx, 000000000xxxxxx} |
Die folgenden Tabellen sind eine Anleitung für die Konvertierung von festem Punkt in dezimale und dezimale Darstellung. Das erste verwendbare Bit in der Binärmaske ist das Zeichenbit, und der Rest der Binären Maske besteht aus dem numerischen Teil.
Das Zahlenschema für vier Bit-Werte, die an EvaluateAttributeSnapped
übergeben werden, ist nicht spezifisch für die Schattierung mit variabler Rate. Es wird hier wiederholt, um Vollständigkeit zu erhalten.
Für Vier-Bit-Werte.
Binärwert | Dezimal | Fraktioniert |
---|---|---|
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 | Dezimal | Fraktioniert |
---|---|---|
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 | Dezimal | Fraktioniert |
---|---|---|
100000 | -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 wird EvaluateAttributeSnapped
Raster der auswertbaren Positionen bei Verwendung einer groben Pixelschattierung an der groben Pixelmitte zentriert.
SetSamplePositions
Wenn die API ID3D12GraphicsCommandList1::SetSamplePositions mit grober Schattierung verwendet wird, legt die API die Beispielpositionen für feine Pixel fest.
SV_Coverage
Wenn SV_Coverage
als Shadereingabe oder -ausgabe auf Ebene 1 deklariert wird, wird die grobe Pixelschattierung deaktiviert.
Sie können die SV_Coverage
Semantik mit grober Pixelschattierung auf Ebene 2 verwenden und spiegelt wider, welche Beispiele eines MSAA-Ziels geschrieben werden.
Wenn grobe Pixelschattierung verwendet wird – sodass mehrere Quellpixel eine Kachel umfassen können – stellt das Abdeckungsformat alle Beispiele dar, die aus dieser Kachel stammen.
Aufgrund der Kompatibilität der groben Pixelschattierung mit MSAA kann die Anzahl der für die Angabe erforderlichen Abdeckungsbits variieren. Bei einer 4x MSAA-Ressource mit D3D12_SHADING_RATE_2x2wird beispielsweise jedes grobe Pixel auf vier feine Pixel geschrieben, und jedes feine Pixel verfügt über vier Beispiele. Dies bedeutet, dass jedes grobe Pixel insgesamt 4 * 4 = 16 Beispiele schreibt.
Anzahl der benötigten Abdeckungsbits
In der folgenden Tabelle wird angegeben, 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, grobe Pixel zum gleichzeitigen Schreiben in mehr als 16 Beispiele zu verwenden, indem das Feature für Schattierung mit variabler Rate über Direct3D 12 verfügbar gemacht wird. Diese Einschränkung ist auf die Einschränkungen von Direct3D 12 zurückzuführen, in denen MSAA-Ebenen zulässig sind, mit welcher groben Pixelgröße (siehe Tabelle im Mit Variable-Rate-Schattierung (VRS) Abschnitt in diesem Thema).
Sortieren und Format von Bits in der Abdeckungsmaske
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-Hauptreihenfolge). Abdeckungsbits sind die Bits mit niedriger Reihenfolge der Abdeckungsemantik und sind dicht zusammengepackt.
Die folgende Tabelle zeigt das Abdeckungsformat für unterstützte Kombinationen von grober Pixelgröße und MSAA-Ebene.
In der folgenden Tabelle sind 2 x MSAA-Pixel dargestellt, wobei jedes Pixel zwei Beispiele von Indizes 0 und 1 enthält.
Die Positionierung der Beschriftungen von Beispielen auf den Pixeln dient zu Veranschaulichungszwecken und vermitteln nicht unbedingt die räumlichen {X-, Y}-Speicherorte von Beispielen auf diesem Pixel; insbesondere da Beispielpositionen programmgesteuert geändert werden können. Beispiele werden anhand ihres 0-basierten Indexes referenziert.
Die folgende Tabelle zeigt 4 x MSAA-Pixel, wobei jedes Pixel vier Beispiele für Indizes 0, 1, 2 und 3 enthält.
Abwerfen
Wenn die HLSL-semantische discard
mit grober Pixelschattierung verwendet wird, werden grobe Pixel verworfen.
Zielunabhängige Rasterung (TIR)
TIR wird nicht unterstützt, wenn grobe Pixelschattierung verwendet wird.
Rasterreihenfolgeansichten (ROVs)
ROV-Interlocks werden als feiner Pixel-Granularität festgelegt. Wenn die Schattierung pro Beispiel ausgeführt wird, werden Interlocks bei der Stichproben granularität ausgeführt.
Konservative Rasterung
Sie können konservative Rasterung mit variabler Schattierung verwenden. Wenn die konservative Rasterung mit grober Pixelschattierung verwendet wird, werden feine Pixel in groben Pixeln konservativer Weise gerastert, indem sie vollständig abgedeckt werden.
Berichterstattung
Wenn konservative Rasterung verwendet wird, enthält die Abdeckungsemantik vollständige Masken für feine Pixel, die abgedeckt sind, und 0 für feine Pixel, die nicht abgedeckt sind.
Bündel
Sie können Schattierungs-APIs mit variabler Rate für ein Bündel aufrufen.
Renderdurchläufe
Sie können Schattierungs-APIs mit variabler Rate in einem Renderdurchlaufaufrufen.
Aufrufen der VRS-APIs
In diesem nächsten Abschnitt wird beschrieben, wie auf die Variable-Rate-Schattierung für Ihre Anwendung über Direct3D 12 zugegriffen werden kann.
Funktionsabfrage
Rufen Sie ID3D12Device::CheckFeatureSupport mit D3D12_FEATURE::D 3D12_FEATURE_D3D12_OPTIONS6auf, und stellen Sie eine D3D12_FEATURE_DATA_D3D12_OPTIONS6 Struktur bereit, die für Sie ausgefüllt werden soll. Die D3D12_FEATURE_DATA_D3D12_OPTIONS6-Struktur enthält mehrere Elemente, einschließlich eines des aufgezählten Typs 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).
Um z. B. die Funktion der Ebene 1 abzufragen, 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;
Schattierungsraten
Die Werte in der D3D12_SHADING_RATE Enumeration sind so angeordnet, dass Schattierungsraten leicht in zwei Achsen zerlegt werden können, wobei die Werte jeder Achse im logarithmischen Raum entsprechend der D3D12_AXIS_SHADING_RATE Enumerationkompakt dargestellt werden.
Sie können ein Makro erstellen, um zwei Achsenschattierungsraten in einer Schattierungsrate 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 d3d12.h
definiert sind.
#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 SV_ShaderRate
zu dissectieren und zu verstehen.
Anmerkung
Diese Dateninterpretation ist auf die Beschreibung des Bildschirmraumbilds ausgerichtet, das von Shadern bearbeitet werden kann. Dies wird weiter in den obigen Abschnitten erläutert. Es gibt jedoch keinen Grund, eine konsistente Definition der groben Pixelgrößen zu haben, die überall verwendet werden sollen, einschließlich der Einstellung der Schattierungsrate auf Befehlsebene.
Festlegen der Schattierungsrate auf Befehlsebene und Kombinationen
Die Schattierungsrate und optional kombinationsfähige Kombinationen 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.
Vorbereiten des Bildschirmbereichsbilds
Der schreibgeschützte Ressourcenzustand, der ein verwendbares Schattierungsratenbild angibt, wird als D3D12_RESOURCE_STATES::D 3D12_RESOURCE_STATE_SHADING_RATE_SOURCEdefiniert.
Festlegen des Bildschirmbereichsbilds
Sie geben das Bildschirmbereichsbild über die ID3D12GraphicsCommandList5::RSSetShadingRateImage-Methode an.
m_commandList->RSSetShadingRateImage(screenSpaceImage);
Abfragen der Kachelgröße
Sie können die Kachelgröße aus dem D3D12_FEATURE_DATA_D3D12_OPTIONS6::ShadingRateImageTileSize Member abfragen. Siehe Funktionenabfragen weiter oben.
Eine Dimension wird abgerufen, da die horizontalen und vertikalen Abmessungen immer gleich sind. Wenn die Funktion des Systems D3D12_SHADING_RATE_TIER_NOT_SUPPORTEDist, ist die zurückgegebene Kachelgröße 0.