Regeln für die Rasterung
Rasterungsregeln definieren, wie Vektordaten in Rasterdaten zugeordnet werden. Die Rasterdaten werden an ganzzahlige Positionen angedockt, die dann gekullt und abgeschnitten werden (um die Mindestanzahl von Pixeln zu zeichnen), und die Attribute pro Pixel werden interpoliert (von Pro-Vertex-Attributen), bevor sie an einen Pixelshader übergeben werden.
Es gibt mehrere Arten von Regeln, die vom Typ des Grundtyps abhängen, der zugeordnet wird, und ob die Daten Multisampling verwenden, um Aliasing zu reduzieren. Die folgenden Abbildungen veranschaulichen, wie die Eckfälle behandelt werden.
Dreiecksrasterungsregeln (ohne Multisampling)
Jede Pixelmitte, die in ein Dreieck fällt, wird gezeichnet; Ein Pixel wird angenommen, wenn es die regel oben links übergibt. Die regel oben links ist, dass eine Pixelmitte definiert ist, um innerhalb eines Dreiecks zu liegen, wenn sie sich am oberen Rand oder am linken Rand eines Dreiecks befindet.
Dabei gilt Folgendes:
- Ein oberer Rand ist eine Kante, die genau horizontal ist und über den anderen Rändern liegt.
- Ein linker Rand ist ein Rand, der nicht genau horizontal ist und sich auf der linken Seite des Dreiecks befindet. Ein Dreieck kann ein oder zwei linke Kanten aufweisen.
Die oben linke Regel stellt sicher, dass benachbarte Dreiecke einmal gezeichnet werden.
Diese Abbildung zeigt Beispiele für Pixel, die gezeichnet werden, da sie entweder innerhalb eines Dreiecks liegen oder der regel oben links folgen.
Die hell- und dunkelgraue Abdeckung der Pixel zeigt sie als Gruppen der Pixel an, um anzugeben, in welchem Dreieck sie sich befinden.
Line Rasterization Rules (Aliased, Without Multisampling)
Linienrasterungsregeln verwenden einen Rautentestbereich, um festzustellen, ob eine Linie ein Pixel abdeckt. Bei X-Hauptlinien (Linien mit -1 <= Steigung <= +1) enthält der Rautentestbereich den unteren linken Rand, den unteren rechten Rand und die untere Ecke; die Raute schließt die obere linke Kante, die obere rechte Kante, die obere rechte Kante, die linke ecke und die rechte Ecke aus. Eine y-Hauptzeile ist jede Zeile, die keine X-Hauptlinie ist; Der Test rautenbereich ist identisch mit der beschreibung für die X-Hauptlinie, außer die rechte Ecke ist ebenfalls enthalten.
Angesichts des Rautenbereichs deckt eine Linie ein Pixel ab, wenn die Linie den Rautentestbereich des Pixels verlässt, wenn sie vom Anfang zum Ende entlang der Linie reisen. Ein Linienstreifen verhält sich genauso, wie er als Eine Reihe von Linien gezeichnet wird.
Die folgende Abbildung zeigt einige Beispiele.
Regeln für die Linienrasterung (antialiased, ohne Multisampling)
Eine antialiasierte Linie wird gerastert, als wäre sie ein Rechteck (mit Breite = 1). Das Rechteck überschneidet sich mit einem Renderziel, das Pro-Pixel-Abdeckungswerte erzeugt, die in Alpha-Komponenten des Pixelshaders multipliziert werden. Beim Zeichnen von Linien auf einem Multisampling-Renderziel ist keine Antialiasierung vorgeformt.
Es wird angenommen, dass es keine einzige "beste" Möglichkeit gibt, antialiasierte Linienrendering durchzuführen. Direct3D übernimmt als Richtlinie die in der folgenden Abbildung gezeigte Methode. Diese Methode wurde empirisch abgeleitet, wobei eine Reihe visueller Eigenschaften als wünschenswert angesehen wurde.
Hardware muss nicht genau mit diesem Algorithmus übereinstimmen; Tests mit dieser Referenz müssen "angemessene" Toleranzen aufweisen, die von einigen weiter unten aufgeführten Grundsätzen geleitet werden, die verschiedene Hardwareimplementierungen und Filterkerngrößen ermöglichen. Keine dieser Flexibilität, die in der Hardwareimplementierung erlaubt ist, kann jedoch über Direct3D an Anwendungen kommuniziert werden, ohne nur Linien zu zeichnen und zu beobachten/zu messen, wie sie aussehen.
Dieser Algorithmus generiert relativ glatte Linien mit gleichmäßiger Intensität mit minimalen gezackten Kanten oder Geflochten. Die Moire-Musterung für enge Linien wird minimiert. Es gibt eine gute Abdeckung für Verbindungen zwischen Liniensegmenten, die End-to-End platziert wurden.
Der Filterkern ist ein vernünftiger Kompromiss zwischen der Menge der Kante verschwommen und der durch Gammakorrekturen verursachten Änderungen der Intensität. Der Abdeckungswert wird in Pixelshader o0.a (srcAlpha) pro der folgenden Formel durch die Ausgabezusammenführungsstufe (OM) multipliziert:
srcColor * srcAlpha + destColor * (1-srcAlpha)
Punktrasterungsregeln (ohne Multisampling)
Ein Punkt wird so interpretiert, als ob er aus zwei Dreiecken in einem Z-Muster besteht, die Dreiecksrasterungsregeln verwenden. Die Koordinate identifiziert die Mitte eines pixelweiten Quadrats. Es gibt keinen Culling für Punkte.
Die folgende Abbildung zeigt einige Beispiele.
Regeln für die Multisample-Antialiasing-Rasterung
Multisample-Antialiasing (MSAA) reduziert Geometriealiasing mithilfe von Pixelabdeckungs- und Tiefenschablonentests an mehreren Unterbeispielspeicherorten. Um die Leistung zu verbessern, werden Pro-Pixel-Berechnungen für jedes abgedeckte Pixel einmal ausgeführt, indem Shaderausgaben über abgedeckte Unterpixel hinweg freigegeben werden. Multisample-Antialiasing reduziert die Oberflächenaliasierung nicht. Beispielstandorte und Wiederaufbaufunktionen sind von der Hardwareimplementierung abhängig.
Die folgende Abbildung zeigt einige Beispiele.
Die Anzahl der Beispielspeicherorte hängt vom Multisamplemodus ab. Vertexattribute werden in Pixelzentrierung interpoliert, da hier der Pixelshader aufgerufen wird (dies wird extrapoliert, wenn die Mitte nicht abgedeckt ist). Attribute können im Pixel-Shader als Schwerpunkt gekennzeichnet werden, was dazu führt, dass nicht abgedeckte Pixel das Attribut am Schnittpunkt des Pixelbereichs und des Grundtyps interpolieren.
Ein Pixelshader wird für jeden 2x2-Pixelbereich ausgeführt, um abgeleitete Berechnungen zu unterstützen (die x- und y-Deltas verwenden). Dies bedeutet, dass Shaderaufrufe mehr auftreten als gezeigt werden, um den minimalen 2x2-Quanta (der unabhängig von Multisampling ist) auszufüllen. Das Shaderergebnis wird für jedes abgedeckte Beispiel geschrieben, das den Tiefenschablonentest pro Beispiel bestanden hat.
Rasterungsregeln für Grundtypen sind im Allgemeinen durch Multisample-Antialiasing unverändert, außer:
Für ein Dreieck wird ein Abdeckungstest für jeden Beispielstandort (nicht für eine Pixelmitte) durchgeführt. Wenn mehr als eine Beispielposition abgedeckt ist, wird ein Pixelshader einmal mit Attributen ausgeführt, die in der Pixelmitte interpoliert sind. Das Ergebnis wird für jeden abgedeckten Beispielspeicherort im Pixel gespeichert (repliziert), der den Tiefen-/Schablonentest bestanden hat.
Eine Linie wird als Rechteck aus zwei Dreiecken mit einer Linienbreite von 1,4 behandelt.
Für einen Punkt wird ein Abdeckungstest für jede Beispielposition (nicht für eine Pixelmitte) durchgeführt.
Multisamplingformate können in Renderzielen verwendet werden, die mithilfe von Ladevorgängen wieder in Shader gelesen werden können, da für einzelne Beispiele, auf die vom Shader zugegriffen wird, keine Auflösung erforderlich ist. Tiefenformate werden für Multisampleressourcen nicht unterstützt. Daher sind Tiefenformate nur auf Renderziele beschränkt.
Typlose Formate unterstützen Multisampling, damit eine Ressourcenansicht Daten auf unterschiedliche Weise interpretieren kann. Sie können beispielsweise eine Multisampleressource mithilfe von R8G8B8A8_TYPELESS erstellen, mit einer Renderzielansichtsressource mit einem R8G8B8A8_UINT Format rendern und dann den Inhalt mit einem R8G8B8A8_UNORM Datenformat in eine andere Ressource auflösen.
Hardwareunterstützung
Die API meldet die Hardwareunterstützung für Multisampling über die Anzahl der Qualitätsstufen. Beispielsweise bedeutet eine Qualitätsstufe 0, dass die Hardware multisampling (auf einem bestimmten Format- und Qualitätsniveau) nicht unterstützt. Ein 3 für Qualitätsstufen bedeutet, dass die Hardware drei verschiedene Beispiellayouts und/oder Auflösungsalgorithmen unterstützt. Sie können auch Folgendes annehmen:
- Jedes Format, das Multisampling unterstützt, unterstützt die gleiche Anzahl von Qualitätsstufen für jedes Format in dieser Familie.
- Jedes Format, das Multisampling unterstützt und über die formate _UNORM, _SRGB, _SNORM oder _FLOAT verfügt, unterstützt auch die Auflösung.
Centroid Sampling of Attributes when Multisample Antialiasing
Vertexattribute werden standardmäßig während der Multisample-Antialiasing zu einem Pixelmittelpunkt interpoliert. Wenn die Pixelmitte nicht abgedeckt ist, werden Attribute auf eine Pixelmitte extrapoliert. Wenn eine Pixelshadereingabe, die die Centroid-Semantik enthält (vorausgesetzt, das Pixel ist nicht vollständig abgedeckt) irgendwo innerhalb des abgedeckten Bereichs des Pixels, möglicherweise an einem der abgedeckten Beispielspeicherorte, stichprobeniert wird. Eine Beispielmaske (angegeben durch den Rasterizerzustand) wird vor der Centroid-Berechnung angewendet. Daher wird ein Beispiel, das maskiert ist, nicht als Centroid-Position verwendet.
Der Referenzrasterizer wählt einen Beispielspeicherort für die Schwerpunktsampling wie folgt aus:
- Die Beispielmaske ermöglicht alle Beispiele. Verwenden Sie eine Pixelmitte, wenn das Pixel abgedeckt ist oder keines der Beispiele abgedeckt ist. Andernfalls wird das erste behandelte Beispiel ausgewählt, beginnend mit der Pixelmitte und nach außen.
- Die Beispielmaske deaktiviert alle Beispiele außer einem Beispiel (ein gängiges Szenario). Eine Anwendung kann Multipass-Supersampling implementieren, indem sie durch Ein-Bit-Beispielmaskenwerte durchlaufen und die Szene für jedes Beispiel mithilfe des Centroid-Samplings neu rendern. Dies würde erfordern, dass eine Anwendung Derivate anpasst, um entsprechend detailliertere Textur mips für die höhere Textursamplingdichte auszuwählen.
Abgeleitete Berechnungen beim Multisampling
Pixel-Shader werden immer mit einem minimalen 2 x 2-Pixelbereich ausgeführt, um abgeleitete Berechnungen zu unterstützen, die berechnet werden, indem Deltas zwischen Daten aus angrenzenden Pixeln verwendet werden (wobei davon ausgegangen wird, dass die Daten in jedem Pixel horizontal oder vertikal mit Einheitenabstand abgesampt wurden). Dies ist von Multisampling nicht betroffen.
Wenn Derivate für ein Attribut angefordert werden, das zentriert wurde, wird die Hardwareberechnung nicht angepasst, was zu ungenauen Ableitungen führen kann. Ein Shader erwartet einen Einheitenvektor im Renderzielbereich, kann jedoch einen Vektor ohne Einheit in Bezug auf einen anderen Vektorraum erhalten. Daher liegt es in der Verantwortung einer Anwendung, beim Anfordern von Ableitungen von Attributen, die zentriert sind, Vorsicht zu zeigen.
In der Tat wird empfohlen, keine Ableitungen und Centroid-Samplings zu kombinieren. Das Sampling von Centroid kann für Situationen nützlich sein, in denen es wichtig ist, dass die interpolierten Attribute eines Grundtyps nicht extrapoliert werden, aber dies kommt zu Kompromissen wie Attributen, die scheinbar springen, wenn ein Grundtyprand ein Pixel kreuzt (anstatt kontinuierlich zu ändern) oder Ableitungen, die nicht von Textursamplingvorgängen verwendet werden können, die LOD ableiten.
Verwandte Themen