Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Rasterungsregeln definieren, wie Vektordaten in Rasterdaten zugeordnet werden. Die Rasterdaten werden auf ganzzahlige Positionen ausgerichtet, anschließend gefiltert und zugeschnitten (um die minimale Anzahl an Pixeln zu zeichnen), und die Attribute pro Pixel werden (aus den Attributen pro Vertex) interpoliert, bevor sie an einen Pixel-Shader ü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 Randfälle behandelt werden.
Note
Diese Direct3D-Rasterungsregeln gelten für Apps, unabhängig davon, ob sie das Win32- oder UWP-App-Modell verwenden.
- Dreiecksrasterungsregeln (ohne Multisampling)
- Regeln für die Linienrasterung (mit Aliasing, ohne Multisampling)
- Regeln für die Linienrasterung (Antialiased, ohne Multisampling)
- Punktrasterungsregeln (ohne Multisampling)
- Rasterisierungsregeln für Multisample-Antialiasing
- Verwandte Themen
Dreiecksrasterungsregeln (ohne Multisampling)
Jedes Pixelzentrum, das innerhalb eines Dreiecks liegt, wird gezeichnet; ein Pixel gilt als innerhalb des Dreiecks, wenn es die Top-Left-Regel erfüllt. Die regel oben links ist, dass eine Pixelmitte definiert ist, um innerhalb eines Dreiecks zu liegen, wenn sie sich auf dem oberen Rand befindet, während sie nicht an einem rechten Rand liegt oder wenn sie sich auf einem linken Rand befindet, während sie nicht am unteren Rand liegt.
Wo:
- Ein oberer Rand ist eine Kante, die genau horizontal ist und über den anderen Rändern liegt.
- Ein unterer Rand ist eine Kante, die genau horizontal ist und sich unter den anderen Rändern befindet.
- 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.
- Ein rechter Rand ist ein Rand, der nicht genau horizontal ist und sich auf der rechten Seite des Dreiecks befindet. Ein Dreieck kann einen oder zwei rechte Ränder 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.
Linienrasterisierungsregeln (gerastert, ohne Multisampling)
Regeln für die Linienrasterung verwenden einen diamantförmigen Testbereich, um festzustellen, ob eine Linie ein Pixel abdeckt. Bei x-Hauptlinien (Linien mit -1 <= Steigung <= +1) umfasst der Rauten-Testbereich (durchgezogen dargestellt) die untere linke Kante, die untere rechte Kante und die untere Ecke; die Raute schließt (gestrichelt dargestellt) die obere linke Kante, die obere rechte Kante, die obere Ecke, die linke Ecke und die rechte Ecke aus. Eine y-Hauptlinie ist jede Linie, die keine x-Hauptlinie ist; der Testdiamantbereich ist derselbe wie für die x-Hauptlinie beschrieben, außer dass die rechte Ecke ebenfalls eingeschlossen ist.
Ausgehend vom Rautenbereich deckt eine Linie ein Pixel ab, wenn sie den Rauten-Testbereich des Pixels verlässt, während man der Linie vom Anfang zum Ende folgt. Ein Linienzug verhält sich ebenso, da er als eine Folge 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 wird keine Kantenglättung durchgeführt.
Es wird angenommen, dass es keine einzige "beste" Möglichkeit gibt, antialiasierte Linienrendering durchzuführen. Direct3D 10 ü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. Diese in der Hardwareimplementierung mögliche Flexibilität kann jedoch nicht über Direct3D 10 an Anwendungen weitergegeben werden, abgesehen davon, einfach Linien zu zeichnen und zu beobachten bzw. 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 angemessener Kompromiss zwischen dem Ausmaß der Kantenunschärfe und den durch Gammakorrekturen verursachten Intensitätsänderungen. Der Coverage-Wert wird von der Output-Merger-Stufe gemäß der folgenden Formel mit dem Pixel-Shader-Ausgang o0.a (srcAlpha) 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 Berechnungen pro Pixel für jedes abgedeckte Pixel nur einmal durchgeführt, indem Shader-Ausgaben von den abgedeckten Subpixeln gemeinsam genutzt 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 Abtastpositionen hängt vom Multisample-Modus ab. Vertex-Attribute werden an den Pixelmittelpunkten interpoliert, da dort der Pixel-Shader aufgerufen wird (dies wird zu einer Extrapolation, wenn der Mittelpunkt nicht abgedeckt ist). Attribute können im Pixel-Shader für die Zentroid-Abtastung markiert werden, was dazu führt, dass nicht vollständig abgedeckte Pixel das Attribut im Schnittbereich der Pixelfläche und der Primitive 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 Shader-Aufrufe häufiger auftreten, als gezeigt wird, um die minimalen 2x2-Quanten auszufüllen (was unabhängig vom Multisampling ist). Das Shaderergebnis wird für jedes abgedeckte Beispiel geschrieben, das den Tiefenschablonentest pro Beispiel bestanden hat.
Die Rasterungsregeln für Primitiven werden durch Multisample-Antialiasing im Allgemeinen nicht verä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.
Viele Formate unterstützen Multisampling (siehe Hardwareunterstützung für Direct3D 10-Formate), einige Formate können aufgelöst werden (ResolveSubresource; wodurch ein Multisampling-Format auf eine Beispielgröße von 1 herabgesetzt wird). Multisamplingformate können in Renderzielen verwendet werden, die mithilfe von Ladenwieder 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 (z. B. R8G8B8A8_TYPELESS) unterstützen Multisampling, damit eine Ressourcenansicht Daten auf unterschiedliche Weise interpretieren kann. Sie könnten beispielsweise eine Multisample-Ressource mit R8G8B8A8_TYPELESS erstellen, mithilfe einer Render-Target-View-Ressource im Format R8G8B8A8_UINT dorthin rendern und den Inhalt anschließend mit dem Datenformat R8G8B8A8_UNORM 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.
Zentroidsampling von Attributen bei Multisample zur Kantenglättung
Standardmäßig werden Vertex-Attribute beim Multisample-Antialiasing auf den Pixelmittelpunkt interpoliert; wenn der Pixelmittelpunkt nicht abgedeckt ist, werden die Attribute auf den Pixelmittelpunkt 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 abgetastet wird, dann möglicherweise an einer der abgedeckten Abtastpositionen. 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 eine Sample-Position für die Schwerpunktabtastung wie folgt:
- Die Beispielmaske ermöglicht alle Beispiele. Verwenden Sie eine Pixelmitte, wenn das Pixel abgedeckt ist oder keines der Beispiele abgedeckt ist. Andernfalls wird die erste abgedeckte Probe ausgewählt, ausgehend von der Pixelmitte nach außen.
- Die Sample-Maske deaktiviert alle Samples bis auf ein Sample (ein häufiges Szenario). Eine Anwendung kann Multipass-Supersampling implementieren, indem sie Ein-Bit-Sample-Mask-Werte zyklisch durchläuft und die Szene für jedes Sample unter Verwendung von Centroid-Sampling neu rendert. 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 für ein Attribut, das mit Schwerpunktabtastung abgetastet wurde, Derivate angefordert werden, wird die Hardwareberechnung nicht angepasst, wodurch ungenaue Derivate entstehen können. Ein Shader erwartet einen Einheitenvektor im Renderzielbereich, kann jedoch einen Vektor ohne Einheit in Bezug auf einen anderen Vektorraum erhalten. Daher ist es Aufgabe der Anwendung, beim Anfordern von Ableitungen von Attributen, die mit Zentroid-Abtastung abgetastet werden, Vorsicht walten zu lassen. Tatsächlich wird empfohlen, Ableitungen nicht mit der Centroid-Abtastung 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