Direct3D 12 Konservative Rasterung
Die konservative Rasterung bietet dem Pixelrendering sicherheit, was insbesondere für Kollisionserkennungsalgorithmen hilfreich ist.
- Übersicht
-
Interaktionen mit der Pipeline
- interaktion Rasterregeln
- Multisamplinginteraktion
- SampleMask-Interaktion
- Tiefen-/Schablonentestinteraktion
- Hilfspixelinteraktion
- Interaktion der Ausgabeabdeckung
- InputCoverage-Interaktion
- InnerCoverage-Interaktion
- Interpolationsinteraktion
- Clippinginteraktion
- Clip Distance-Interaktion
- Interaktion zwischen zielunabhängiger Rasterung
- IA-Grundtopologieinteraktion
- Abfrageinteraktion
- Interaktion mit dem Cull-Zustand
- IsFrontFace-Interaktion
- Füllmodusinteraktion
- Implementierungsdetails
- API-Zusammenfassung
- Verwandte Themen
Überblick
Konservative Rasterung bedeutet, dass alle Pixel, die mindestens teilweise von einem gerenderten Grundtyp abgedeckt sind, gerastert werden, was bedeutet, dass der Pixelshader aufgerufen wird. Normales Verhalten ist Sampling, das nicht verwendet wird, wenn die konservative Rasterung aktiviert ist.
Konservative Rasterung ist in einer Reihe von Situationen nützlich, einschließlich sicherheit bei der Kollisionserkennung, Okklusions-Culling und nebeneinander angeordneten Rendering.
Die folgende Abbildung zeigt z. B. ein grünes Dreieck, das mithilfe der konservativen Rasterung gerendert wird, wie sie im Rasterizer angezeigt wird (d. h. mit 16,8 Festen Punkt-Vertexkoordinaten). Der braune Bereich wird als "Unsicherheitsregion" bezeichnet – eine konzeptionelle Region, die die erweiterten Grenzen des Dreiecks darstellt, die erforderlich sind, um sicherzustellen, dass der Grundtyp im Rasterizer in Bezug auf die ursprünglichen Gleitkommavertexkoordinaten konservative ist. Die roten Quadrate an jedem Scheitelpunkt zeigen, wie der Unsicherheitsbereich berechnet wird: als geschwemmte Quadrat.
Die großen grauen Quadrate zeigen die Pixel an, die gerendert werden. Die rosa Quadrate zeigen Pixel an, die mit dem "Top-Left Rule" gerendert werden, was als Rand des Dreiecks den Rand der Pixel überschreitet. Es können falsch positive Ergebnisse (Pixel festgelegt werden, die nicht vorhanden sein sollten), die das System normalerweise, aber nicht immer ulliert.
Interaktionen mit der Pipeline
Interaktion mit Rasterungsregeln
Im Konservativen Rasterungsmodus gelten Rasterungsregeln auf die gleiche Weise wie wenn der konservative Rasterungsmodus nicht mit Ausnahmen für die oben beschriebene Top-Left Regel und Pixelabdeckung aktiviert ist. 16.8 Fixed-Point Rasterizerpräzision muss verwendet werden.
Pixel, die nicht abgedeckt werden, wenn Hardware vollständige Gleitkommavertexkoordinaten verwendet, können nur einbezogen werden, wenn sie sich innerhalb eines Unsicherheitsbereichs befinden, kein größeres halbes Pixel in der Domäne mit festen Punkten. Zukünftige Hardware wird voraussichtlich die in Stufe 2 angegebene engere Unsicherheitsregion erreichen. Beachten Sie, dass diese Anforderung verhindert, dass schräge Dreiecke weiter als nötig erweitert werden.
Eine ähnliche gültige Unsicherheitsregion gilt auch für InnerCoverage
, ist aber enger, da für diesen Fall keine Implementierungen eine größere Unsicherheitsregion erfordern. Weitere Details finden Sie unter InnerCoverage-Interaktion.
Innere und äußere Unsicherheitsbereiche müssen größer oder gleich der Größe der Hälfte des Subpixelrasters oder 1/512 eines Pixels in der Domäne mit festem Punkt sein. Dies ist die minimale gültige Unsicherheitsregion. 1/512 stammt aus der Koordinatendarstellung des 16,8-Fixpunkt-Rasterizers und der nächstliegenden Regel, die beim Konvertieren von Gleitkommavertexkoordinaten in 16,8 Feste Punktkoordinaten gilt. 1/512 kann sich ändern, wenn sich die Rasterizer-Genauigkeit ändert. Wenn eine Implementierung diesen minimalen Unsicherheitsbereich implementiert, müssen sie der Top-Left Regel folgen, wenn ein Rand oder eine Ecke des Unsicherheitsbereichs entlang der Kante oder Ecke eines Pixels fällt. Die abgeschnittenen Kanten des Unsicherheitsbereichs sollten als nächstgelegener Scheitelpunkt behandelt werden, d. h. sie zählt als zwei Kanten: die beiden, die am zugeordneten Scheitelpunkt verknüpft sind. Top-Left Regel ist erforderlich, wenn der minimale Unsicherheitsbereich verwendet wird, da wenn dies nicht der Grund ist, dass eine Implementierung der konservativen Rasterung Pixel nicht rastert, die beim Deaktivieren des konservativen Rasterungsmodus abgedeckt werden könnten.
Das folgende Diagramm veranschaulicht einen gültigen äußeren Unsicherheitsbereich, der durch Aufräumen eines Quadrats um die Ränder des Grundtyps in der Festen Punktdomäne erzeugt wird (d. h. die Scheitelpunkte wurden durch die 16,8-Festkommadarstellung quantisiert). Die Abmessungen dieses Quadrats basieren auf der gültigen Größe des äußeren Unsicherheitsbereichs: Für die Größe 1/2 eines Pixels ist das Quadrat 1 Pixel in Breite und Höhe, für 1/512 eines Pixels ist das Quadrat 1/256 eines Pixels in Breite und Höhe. Das grüne Dreieck stellt einen bestimmten Grundtyp dar, die rote gepunktete Linie stellt die Grenze für die überschätzte konservative Rasterung dar, die einfarbigen schwarzen Quadrate das Quadrat darstellen, das entlang der Grundtypränder geschwemmt wird, und der blaue hässige Bereich ist der äußere Unsicherheitsbereich:
Multisampling-Interaktion
Unabhängig von der Anzahl der Beispiele in RenderTarget/DepthStencil Oberflächen (oder ob ForcedSampleCount verwendet wird oder nicht), werden alle Beispiele für Pixel abgedeckt, die durch konservative Rasterung gerastert werden. Einzelne Beispielspeicherorte werden nicht getestet, ob sie in den Grundtyp fallen oder nicht.
SampleMask-Interaktion
Die SampleMask Rasterizerstatus gilt auf die gleiche Weise wie wenn die konservative Rasterung nicht für InputCoverage
aktiviert ist, sich jedoch nicht auf InnerCoverage
auswirkt (d. h. es wird nicht in eine mit InnerCoverage
deklarierte Eingabe and'ed) angewendet. Dies liegt daran, dass InnerCoverage
nicht mit der Maskierung von MSAA-Beispielen in Verbindung steht: 0 InnerCoverage
bedeutet nur, dass das Pixel nicht vollständig abgedeckt werden kann, und nicht, dass keine Beispiele aktualisiert werden.
Tiefen-/Schablonentestinteraktion
Tiefen-/Schablonentests werden für ein konservatives Rasterpixel auf die gleiche Weise fortgesetzt, als ob alle Beispiele behandelt werden, wenn die konservative Rasterung nicht aktiviert ist.
Wenn Sie mit allen behandelten Beispielen fortfahren, kann dies zu einer tiefen Extrapolation führen, die gültig ist und wie angegeben an den Viewport geklammert werden muss, wenn die konservative Rasterung nicht aktiviert ist. Dies ähnelt der Verwendung von Interpolationsmodi mit Pixelfrequenz auf einem RenderTarget- mit einer Stichprobenanzahl von mehr als 1. Bei der konservativen Rasterung ist es jedoch der Tiefenwert, der in den Tiefentest für feste Funktionen wechselt, der extrapoliert werden kann.
Das Frühe Tiefen-Culling-Verhalten bei tiefen extrapolation ist nicht definiert. Dies liegt daran, dass einige Hardware für early Depth culling nicht ordnungsgemäß extrapolierte Tiefenwerte unterstützen kann. Das Verhalten der early Depth culling in Anwesenheit von Tiefen extrapolation ist jedoch auch bei Hardware problematisch, die extrapolierte Tiefenwerte unterstützen kann. Dieses Problem kann behoben werden, indem die Pixel-Shader-Eingabetiefe an die Min- und Max-Tiefenwerte des Grundtyps gerastert und dieser Wert in oDepth
geschrieben wird (das Pixel-Shader-Ausgabe-Tiefenregister). Implementierungen sind erforderlich, um early Depth culling in diesem Fall aufgrund des oDepth
Schreibvorgangs zu deaktivieren.
Hilfspixelinteraktion
Hilfspixelregeln gelten genauso wie bei nicht aktivierter konservativer Rasterung. In diesem Rahmen müssen alle Pixel einschließlich Hilfspixeln InputCoverage
genau wie im Abschnitt InputCoverage
Interaktion angegeben melden. Daher berichten vollständig nicht abgedeckte Pixel 0 Abdeckung.
Ausgabeabdeckungsinteraktion
Die Ausgabeabdeckung (oMask
) verhält sich für ein konservatives rasterisiertes Pixel, wie dies der Fall ist, wenn die konservative Rasterung nicht mit allen behandelten Beispielen aktiviert ist.
InputCoverage-Interaktion
Im Konservativen Rasterungsmodus wird dieses Eingaberegister aufgefüllt, als ob alle Beispiele behandelt werden, wenn die konservative Rasterung für ein bestimmtes konservatives rasterisiertes Pixel nicht aktiviert ist. Das heißt, alle vorhandenen Interaktionen gelten (z. B. SampleMask- angewendet), und die ersten n Bits in InputCoverage
aus dem LSB werden für ein konservatives rasterisiertes Pixel auf 1 festgelegt, wenn ein Beispiel pro Pixel RenderTarget und/oder DepthStencil Puffer an der Ausgabezusammenführunggebunden ist, oder ein n Beispiel ForcedSampleCount. Die restlichen Bits sind 0.
Diese Eingabe ist in einem Shader unabhängig von der Verwendung der konservativen Rasterung verfügbar, obwohl die konservative Rasterung ihr Verhalten ändert, um nur alle behandelten Beispiele anzuzeigen (oder keine für Hilfspixel).
InnerCoverage-Interaktion
Dieses Feature ist erforderlich, und nur in Stufe 3 verfügbar. Die Laufzeit schlägt die Shadererstellung für Shader fehl, die diesen Modus verwenden, wenn eine Implementierung eine Stufe kleiner als Stufe 3 unterstützt.
Der Pixelshader verfügt über einen 32-Bit-skalaren ganzzahligen System generate Value verfügbar: InnerCoverage
. Dies ist ein Bitfeld, das Bit 0 aus dem LSB für ein bestimmtes konservatives rasteriertes Pixel auf 1 festgelegt hat, nur wenn dieses Pixel garantiert vollständig innerhalb des aktuellen Grundtyps ist. Alle anderen Eingaberegisterbits müssen auf 0 festgelegt werden, wenn Bit 0 nicht festgelegt ist, aber nicht definiert sind, wenn Bit 0 auf 1 festgelegt ist (im Wesentlichen stellt dieses Bitfeld einen booleschen Wert dar, bei dem "false" genau 0 sein muss, "true" kann jedoch ein beliebiger ungerader (d. h. Bit 0-Satz) ungleich Nullwert sein. Diese Eingabe wird für unterschätzte konservative Rasterungsinformationen verwendet. Er informiert den Pixelshader darüber, ob sich das aktuelle Pixel vollständig innerhalb der Geometrie befindet.
Dies muss den Andockfehler bei Auflösungen berücksichtigen, die größer oder gleich der Auflösung sind, bei der die aktuelle Zeichnung ausgeführt wird. Es darf keine falsch positiven Ergebnisse geben (Festlegen InnerCoverage
Bits, wenn das Pixel nicht vollständig für andockende Fehler bei Auflösungen abgedeckt wird, die größer oder gleich der Auflösung sind, in der die aktuelle Zeichnung ausgeführt wird), aber falsch negative Negative sind zulässig. Zusammenfassend darf die Implementierung Pixel nicht fälschlicherweise als vollständig abgedeckt identifizieren, die nicht mit vollständigen Gleitkomma-Vertexkoordinaten im Rasterizer enthalten wären.
Pixel, die vollständig abgedeckt werden, wenn Hardware vollständige Gleitkommavertexkoordinaten verwendet, werden möglicherweise nur ausgelassen, wenn sie den inneren Unsicherheitsbereich überschneiden, der nicht größer als die Größe des Subpixelrasters oder 1/256 eines Pixels in der Domäne mit festen Punkten sein darf. Anders gesagt, müssen Pixel vollständig innerhalb der inneren Grenze des inneren Unsicherheitsbereichs als vollständig abgedeckt markiert werden. Die innere Grenze des Unsicherheitsbereichs wird im folgenden Diagramm durch die fett gepunktete linie dargestellt. 1/256 stammt aus der 16,8-Koordinatendarstellung des Rasterizers, die sich ändern kann, wenn sich die Rasterizer-Genauigkeit ändert. Dieser Unsicherheitsbereich reicht aus, um den Andockfehler zu berücksichtigen, der durch die Konvertierung von Gleitkommavertexkoordinaten in Vertexkoordinaten mit festen Punkten im Rasterizer verursacht wird.
Die gleichen 1/512 Mindestunsicherheitsregionenanforderungen, die in der Interaktion mit Rasterungsregeln definiert sind, gelten auch hier.
Das folgende Diagramm veranschaulicht einen gültigen inneren Unsicherheitsbereich, der durch Aufräumen eines Quadrats um die Ränder des Grundtyps in der Festen Punktdomäne erzeugt wird (d. h. die Scheitelpunkte wurden durch die 16,8-Festkommadarstellung quantisiert). Die Abmessungen dieses Quadrats basieren auf der gültigen inneren Unsicherheitsbereichsgröße: Für 1/256 pixel beträgt das Quadrat 1/128 pixel in Breite und Höhe. Das grüne Dreieck stellt einen bestimmten Grundtyp dar, die fett schwarze gepunktete Linie stellt die Grenze des inneren Unsicherheitsbereichs dar, die durchgezogenen schwarzen Quadrate das Quadrat, das entlang der grundtypischen Kanten geschwemmt wird, und der orange gepunktete Bereich ist der innere Unsicherheitsbereich:
Die Verwendung von InnerCoverage
wirkt sich nicht darauf aus, ob ein Pixel konservatives Rastern ist, d. h. die Verwendung eines dieser InputCoverage
Modi wirkt sich nicht darauf aus, welche Pixel gerastert werden, wenn der konservative Rastermodus aktiviert ist. Wenn InnerCoverage
verwendet wird und der Pixel-Shader ein Pixel verarbeitet, das nicht vollständig von der Geometrie abgedeckt wird, lautet der Wert 0, aber der Pixelshader-Aufruf enthält Beispiele aktualisiert. Dies unterscheidet sich von dem, wenn InputCoverage
0 ist, was bedeutet, dass keine Beispiele aktualisiert werden.
Diese Eingabe schließt sich gegenseitig mit InputCoverage
aus: Beide können nicht verwendet werden.
Um auf InnerCoverage
zuzugreifen, muss sie als einzelne Komponente aus einem der Pixel-Shader-Eingaberegister deklariert werden. Der Interpolationsmodus für die Deklaration muss konstant sein (Interpolation gilt nicht).
Das InnerCoverage
Bitfeld ist nicht von Tiefen-/Schablonentests betroffen, oder es wird mit dem SampleMask Rasterizerzustand ANDed.
Diese Eingabe ist nur im Konservativen Rasterungsmodus gültig. Wenn die konservative Rasterung nicht aktiviert ist, erzeugt InnerCoverage
einen nicht definierten Wert.
Pixelshaderaufrufe, die durch die Notwendigkeit von Hilfspixeln verursacht werden, andernfalls jedoch nicht vom Grundtyp abgedeckt werden, müssen die InnerCoverage
Register auf 0 festgelegt haben.
Interpolationsinteraktion für Attribute
Die Interpolationsmodi für Attribute sind unverändert und werden auf die gleiche Weise fortgesetzt wie bei nicht aktivierter konservativer Rasterung, wobei die viewportskalierten und konvertierten Scheitelpunkte verwendet werden. Da alle Beispiele in einem konservativen rasterisierten Pixel als abgedeckt betrachtet werden, ist sie gültig, damit Werte extrapoliert werden, ähnlich wie bei Verwendung von Interpolationsmodi mit Pixelfrequenz auf einem RenderTarget- mit Beispielanzahl größer als 1. Centroid-Interpolationsmodi erzeugen Ergebnisse identisch mit dem entsprechenden Interpolationsmodus ohne Schwerpunkt; Das Konzept des Schwerpunkts ist in diesem Szenario bedeutungslos – wenn die Stichprobenabdeckung nur voll oder 0 ist.
Bei der konservativen Rasterung können Dreiecke generiert werden, um Pixel-Shaderaufrufe zu erzeugen. Daher müssen degenerierte Dreiecke die Werte verwenden, die Vertex 0 für alle interpolierten Werte zugewiesen sind.
Clippinginteraktion
Wenn der Modus für die konservative Rasterung aktiviert ist und der Tiefenclip deaktiviert ist (wenn der DepthClipEnable Rasterizer State auf FALSE festgelegt ist), gibt es möglicherweise Abweichungen bei der Attributinterpolation für Segmente eines Grundtyps, die außerhalb der 0 <= z <= w bereich liegen, je nach Implementierung: Beide Konstantenwerte werden von einem Punkt verwendet, an dem sich der Grundtyp zwischen der relevanten Ebene (nah oder weit) befindet. oder die Attributinterpolation verhält sich so, als wenn der konservative Rasterungsmodus deaktiviert ist. Das Tiefenwertverhalten ist jedoch unabhängig vom Konservativen Rasterungsmodus identisch, d. h. Grundtypen, die außerhalb des Tiefenbereichs liegen, müssen dennoch den Wert des nächstgelegenen Grenzwerts des Viewport-Tiefenbereichs erhalten. Das Verhalten der Attributinterpolation innerhalb der <= z <= w muss unverändert bleiben.
Clip Distance-Interaktion
Clip Distance ist gültig, wenn der Konservative Rasterungsmodus aktiviert ist und sich für ein konservatives rasteriertes Pixel verhält, wie dies der Fall ist, wenn die konservative Rasterung nicht mit allen behandelten Beispielen aktiviert ist.
Beachten Sie, dass die konservative Rasterung eine Extrapolation der W-Vertexkoordinate verursachen kann, was dazu führen kann, dass W <= 0. Dies kann dazu führen, dass pro Pixel Clip Distance-Implementierungen für einen Clip Distance ausgeführt werden, der durch einen ungültigen W-Wert geteilt wurde. Clip Distance-Implementierungen müssen vor dem Aufrufen der Rasterung für Pixel schützen, bei denen die Vertexkoordinate W <= 0 (z. B. aufgrund der Extrapolation im Konservativen Rasterungsmodus).
Zielunabhängige Rasterungsinteraktion
Der konservative Rasterungsmodus ist mit der zielunabhängigen Rasterung (TIR) kompatibel. TIR-Regeln und -Einschränkungen gelten und verhalten sich für ein konservatives rasterisiertes Pixel, als ob alle Beispiele behandelt werden.
IA-Grundtopologieinteraktion
Konservative Rasterung ist nicht für Linien- oder Punktgrundtypen definiert. Daher erzeugen primitive Topologien, die Punkte oder Linien angeben, ein nicht definiertes Verhalten, wenn sie zur Rasterizereinheit gespeist werden, wenn die konservative Rasterung aktiviert ist.
Die Debugebenenüberprüfung überprüft, ob Anwendungen diese primitiven Topologien nicht verwenden.
Abfrageinteraktion
Bei einem konservativen rasterten Pixel verhalten sich Abfragen wie bei der konservativen Rasterung nicht, wenn alle Beispiele behandelt werden. Für ein konservatives rasterfähiges Pixel müssen sich D3D12_QUERY_TYPE_OCCLUSION und D3D12_QUERY_TYPE_PIPELINE_STATISTICS (von D3D12_QUERY_TYPE) wie bei nicht aktivierter konservativer Rasterung verhalten, wenn alle Beispiele abgedeckt werden.
Aufrufe von Pixelshadern sollten für jedes konservative Rasterungspixel im konservativen Rasterungsmodus erhöht werden.
Cull State-Interaktion
Alle Cull-Zustände sind im Konservativen Rasterungsmodus gültig und folgen den gleichen Regeln wie bei nicht aktivierter konservativer Rasterung.
Beim Vergleich der konservativen Rasterung über Auflösungen hinweg mit sich selbst oder ohne aktivierte konservative Rasterung besteht die Möglichkeit, dass einige Grundtypen möglicherweise eine nicht übereinstimmende Gegenüberstellung haben (d. h. eine Rückseite, die andere Vorderseite). Anwendungen können diese Unsicherheit vermeiden, indem sie D3D12_CULL_MODE_NONE (von D3D12_CULL_MODE) verwenden und nicht den IsFrontFace
vom System generierten Wert verwenden.
IsFrontFace-Interaktion
Der IsFrontFace
Vom System generierten Wert gilt für die Verwendung im Konservativen Rasterungsmodus und folgt dem Verhalten, das definiert wird, wenn die konservative Rasterung nicht aktiviert ist.
Füllmodi-Interaktion
Die einzige gültige D3D12_FILL_MODE für die konservative Rasterung ist D3D12_FILL_SOLID, jeder andere Füllmodus ist ein ungültiger Parameter für den Rasterizerstatus.
Dies liegt daran, dass die funktionale D3D12-Spezifikation angibt, dass der Drahtmodellfüllmodus Dreiecksränder in Linien konvertieren und den Regeln für die Linienrasterung folgen und das Verhalten der konservativen Linienrasterung nicht definiert wurde.
Implementierungsdetails
Die in Direct3D 12 unterstützte Rasterungsart wird manchmal als "Überschätzte konservative Rasterung" bezeichnet. Es gibt auch das Konzept der "Unterschätzten konservativen Rasterung", was bedeutet, dass nur Pixel, die vollständig von einem gerenderten Grundtyp abgedeckt werden, gerastert werden. Unterschätzte konservative Rasterungsinformationen sind über den Pixelshader über die Verwendung von Eingabeabdeckungsdaten verfügbar, und nur die überschätzte konservative Rasterung ist als Rastermodus verfügbar.
Wenn ein Teil eines Grundtyps ein Pixel überlappt, wird dieses Pixel als abgedeckt betrachtet und dann gerastert. Wenn ein Rand oder eine Ecke eines Grundtyps entlang der Kante oder Ecke eines Pixels fällt, ist die Anwendung der "oben links"-Regel implementierungsspezifisch. Bei Implementierungen, die entgenerte Dreiecke unterstützen, muss jedoch ein entgenerates Dreieck entlang eines Rands oder einer Ecke mindestens ein Pixel umfassen.
Konservative Rasterungsimplementierungen können auf unterschiedlicher Hardware variieren und falsch positive Ergebnisse erzeugen, was bedeutet, dass sie fälschlicherweise entscheiden können, dass Pixel abgedeckt werden. Dies kann aufgrund von implementierungsspezifischen Details wie primitiven Wachsenden oder Andockfehlern auftreten, die den in der Rasterung verwendeten Vertexkoordinaten mit festen Punkten inhärent sind. Der Grund für falsch positive Ergebnisse (in Bezug auf Vertexkoordinaten mit festen Punkten) ist gültig, da einige falsch positive Ergebnisse erforderlich sind, um eine Implementierung zu ermöglichen, die Abdeckung mit postgedockten Scheitelpunkten (d. h. Vertexkoordinaten, die von Gleitkommakoordinaten in den 16,8-Festenpunkt konvertiert wurden, der im Rasterizer verwendet wird), aber berücksichtigen Sie die Abdeckung, die von den ursprünglichen Gleitkommavertexkoordinaten erzeugt wird.
Konservative Rasterungsimplementierungen erzeugen keine falschen Negativen in Bezug auf die Gleitkommavertexkoordinaten für nicht entgenerierte Post-Snap-Grundtypen: Wenn ein Teil eines Grundtyps einen Teil eines Pixels überlappt, wird dieses Pixel gerastert.
Dreiecke, die degeneriert sind (doppelte Indizes in einem Indexpuffer oder Collinear in 3D) oder werden nach der Konvertierung mit festem Punkt (kollineare Scheitelpunkte im Rasterizer) degeneriert oder nicht gekullt; beide sind gültige Verhaltensweisen. Degenerate Dreiecke müssen als nach hinten gerichtet betrachtet werden. Wenn also ein bestimmtes Verhalten für eine Anwendung erforderlich ist, kann sie das Culling der Rückseite oder den Test für die Vorderseite verwenden. Degenerierte Dreiecke verwenden die Werte, die Vertex 0 für alle interpolierten Werte zugewiesen sind.
Zusätzlich zur Möglichkeit, dass die Hardware dieses Feature nicht unterstützt, gibt es drei Ebenen der Hardwareunterstützung.
- Stufe 1 erzwingt einen maximal 1/2 Pixel unsicheren Bereich und unterstützt keine Nachrastfehler. Dies eignet sich gut für das nebeneinander angeordnete Rendering, einen Texturatlas, eine Lichtkartengenerierung und Schattenkarten mit Unterpixeln.
- Stufe 2 reduziert die maximale Unsicherheitsregion auf 1/256 und erfordert, dass Post-Snap-Entgeneate nicht gekullt werden. Diese Stufe ist für die CPU-basierte Algorithmusbeschleunigung (z. B. Voxelization) hilfreich.
- Stufe 3 behält eine maximale 1/256-Unsicherheitsregion bei und fügt Unterstützung für die interne Eingabeabdeckung hinzu. Die innere Eingabeabdeckung fügt den neuen Wert
SV_InnerCoverage
zur High Level Shading Language (HLSL) hinzu. Dies ist eine 32-Bit-Skalare ganze Zahl, die bei der Eingabe für einen Pixelshader angegeben werden kann, und stellt die unterschätzten Konservativen Rasterungsinformationen dar (d. h. ob ein Pixel garantiert ist -to-be- vollständig abgedeckt). Diese Ebene ist hilfreich für okklusions-Culling.
API-Zusammenfassung
Die folgenden Methoden, Strukturen, Enumerationen und Hilfsklassen verweisen auf konservative Rasterung:
- D3D12_RASTERIZER_DESC: Struktur mit der Beschreibung des Rasterizers.
- D3D12_CONSERVATIVE_RASTERIZATION_MODE: Enumerationswerte für den Modus (ein oder aus).
- D3D12_FEATURE_DATA_D3D12_OPTIONS: Struktur, die die Unterstützungsebene hält.
- D3D12_CONSERVATIVE_RASTERIZATION_TIER: Enumerationswerte für jede Ebene der Unterstützung durch die Hardware.
- CheckFeatureSupport: Methode für den Zugriff auf die unterstützten Features.
- CD3DX12_RASTERIZER_DESC: Hilfsklasse zum Erstellen von Rasterizerbeschreibungen.
Verwandte Themen