Freigeben über


Regeln für die Rasterung

Rasterregeln definieren, wie Vektordaten Rasterdaten zugeordnet werden. Die Rasterdaten werden an ganzzahligen Positionen angedockt, die dann gekullt und abgeschnitten werden (um die Mindestanzahl von Pixeln zu zeichnen), und pro Pixel werden Attribute pro Pixel interpoliert (aus Pro-Vertex-Attributen), bevor sie an einen Pixel-Shader übergeben werden.

Es gibt mehrere Arten von Regeln, die vom Typ des Grundtyps abhängen, der zugeordnet wird, sowie davon, ob die Daten Multisampling verwenden, um aliasing zu reduzieren. Die folgenden Abbildungen veranschaulichen, wie die Eckfälle behandelt werden.

Dreiecksrasterregeln (ohne Multisampling)

Jeder Pixelpunkt, der in ein Dreieck fällt, wird gezeichnet. Es wird davon ausgegangen, dass sich ein Pixel darin befindet, wenn es die Oben-Links-Regel übergibt. Die Oben-Links-Regel ist, dass ein Pixelzentrum so definiert ist, dass er innerhalb eines Dreiecks liegt, wenn er am oberen Rand oder am linken Rand eines Dreiecks liegt.

Dabei gilt Folgendes:

  • Eine obere Kante ist eine Kante, die genau horizontal ist und über den anderen Kanten liegt.
  • Ein linker Rand ist eine Kante, die nicht genau horizontal ist und sich auf der linken Seite des Dreiecks befindet Ein Dreieck kann ein oder zwei linke Kanten haben.

Die oben links stehende Regel stellt sicher, dass benachbarte Dreiecke einmal gezeichnet werden.

Diese Abbildung zeigt Beispiele für Pixel, die gezeichnet werden, weil sie sich entweder in einem Dreieck befinden oder der oben linken Regel folgen.

Beispiele für die Dreieckrasterung oben links

Die hell- und dunkelgraue Abdeckung der Pixel zeigt sie als Gruppen der Pixel an, um anzugeben, welches Dreieck sie sich darin befinden.

Zeilenrasterungsregeln (Alias, ohne Multisampling)

Linienrasterregeln verwenden einen Diamanttestbereich, um zu bestimmen, ob eine Linie ein Pixel bedeckt. Bei x-Hauptlinien (Linien mit -1 <= Steigung <= +1) umfasst der Diamanttestbereich die linke untere Kante, untere rechte Kante und untere Ecke; der Diamant schließt (gepunktet) den oberen linken Rand, den oberen rechten Rand, den oberen rechten Rand, die obere Schnur, die linke Ecke und die rechte Ecke aus. Eine y-Hauptlinie ist jede Linie, die keine x-Hauptlinie ist; der Testdiamantenbereich entspricht der Beschreibung für die x-Hauptlinie, außer die rechte Ecke ist ebenfalls enthalten.

Angesichts des Diamantbereichs deckt eine Linie ein Pixel ab, wenn die Linie den Diamanttestbereich des Pixels verlässt, wenn die Linie vom Anfang gegen Ende entlang der Linie verläuft. Ein Linienstreifen verhält sich genauso, da er als Folge von Linien gezeichnet wird.

Die folgende Abbildung zeigt einige Beispiele.

Beispiele für die Aliaslinienrasterung

Linienrasterungsregeln (Antialiased, Ohne Multisampling)

Eine antialiasierte Linie wird so gerastert, als wäre sie ein Rechteck (mit breite = 1). Das Rechteck schneidet sich mit einem Renderziel, das Pro-Pixel-Coverage-Werte erzeugt, die in Pixel-Shaderausgabe-Alphakomponenten multipliziert werden. Beim Zeichnen von Linien auf einem mehrstufigen Renderziel ist kein Antialiasing vorgeformt.

Es wird davon ausgegangen, dass es keine einzige "beste" Möglichkeit gibt, antialiasiertes Zeilenrendering durchzuführen. Direct3D übernimmt die in der folgenden Abbildung gezeigte Methode als Richtlinie. Diese Methode wurde empirisch abgeleitet und weist eine Reihe von visuellen Eigenschaften auf, die als wünschenswert erachtet wurden.

Hardware muss nicht genau mit diesem Algorithmus übereinstimmen; Tests mit diesem Verweis müssen "angemessene" Toleranzen aufweisen, die sich an einigen der weiter unten aufgeführten Prinzipien orientieren, die verschiedene Hardwareimplementierungen und Filterkerngrößen zulassen. Keine dieser Flexibilitäten, die bei der Hardwareimplementierung zulässig ist, kann jedoch über Direct3D an Anwendungen weitergegeben werden, über das einfache Zeichnen von Linien und das Beobachten/Messen ihrer Darstellung hinaus.

Beispiele für antialiasierte Linienrasterung

Dieser Algorithmus erzeugt relativ glatte Linien mit gleichmäßiger Intensität, mit minimalen zerklüfteten Kanten oder Flechtungen. Die Moiremusterung für enge Linien wird minimiert. Es gibt eine gute Abdeckung für Verbindungen zwischen End-to-End-Segmenten.

Der Filterkern ist ein vernünftiger Kompromiss zwischen dem Umfang der Kantenunschärfe und den Durch Gammakorrekturen verursachten Intensitätsänderungen. Der Abdeckungswert wird mit der Om-Phase (Output Merger) gemäß der folgenden Formel in Pixel-Shader 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 Dreiecksrasterregeln verwenden. Die Koordinate identifiziert den Mittelpunkt eines 1 Pixel breiten Quadrats. Es gibt keine Kulling für Punkte.

Die folgende Abbildung zeigt einige Beispiele.

Beispiele für die Punktrasterung

Multisampel-Antialiasing-Rasterungsregeln

Multisample Antialiasing (MSAA) reduziert geometriealiasing mithilfe von Pixelabdeckungs- und Tiefenschablonentests an mehreren Unterbeispielstandorten. Um die Leistung zu verbessern, werden Berechnungen pro Pixel einmal für jedes abgedeckte Pixel ausgeführt, indem Shaderausgaben für abgedeckte Unterpixel freigegeben werden. Multisampel-Antialiasing reduziert das Oberflächenaliasing nicht. Beispielstandorte und Wiederaufbaufunktionen sind von der Hardwareimplementierung abhängig.

Die folgende Abbildung zeigt einige Beispiele.

Beispiele für die Rasterung von Multisampel-Antialias

Die Anzahl der Beispielspeicherorte hängt vom Multisampelmodus ab. Vertexattribute werden in Pixelzentren interpoliert, da hier der Pixel-Shader aufgerufen wird (dies wird zur Extrapolation, wenn der Mittelpunkt nicht abgedeckt ist). Attribute können im Pixel-Shader als zentriert markiert werden, was dazu führt, dass nicht abgedeckte Pixel das Attribut am Schnittpunkt des Pixelbereichs und des Grundtyps interpolieren.

Ein Pixel-Shader 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 zum Ausfüllen der mindestens 2x2-Quanten angezeigt wird (unabhängig von Multisampling). Das Shaderergebnis wird für jedes abgedeckte Beispiel geschrieben, das den Tiefenschablonentest pro Stichprobe besteht.

Rasterungsregeln für Primitive sind im Allgemeinen durch Multisampel-Antialiasing unverändert, außer:

  • Für ein Dreieck wird ein Abdeckungstest für jeden Beispielstandort (nicht für ein Pixelzentrum) durchgeführt. Wenn mehr als ein Beispielstandort abgedeckt ist, wird ein Pixel-Shader einmal mit Attributen ausgeführt, die in der Pixelmitte interpoliert werden. Das Ergebnis wird für jede abgedeckte Stichprobenposition in dem Pixel gespeichert (repliziert), das den Tiefen-/Schablonentest besteht.

    Eine Linie wird als Rechteck behandelt, das aus zwei Dreiecken besteht und eine Linienbreite von 1,4 aufweist.

  • Für einen Punkt wird ein Abdeckungstest für jeden Beispielstandort (nicht für ein Pixelzentrum) durchgeführt.

Multisamplingformate können in Renderzielen verwendet werden, die mithilfe des Ladens in Shader zurückgelesen werden können, da für einzelne Beispiele, auf die der Shader zugreift, 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. Für instance können Sie eine Multisampelressource mit R8G8B8A8_TYPELESS erstellen, sie mithilfe einer Render-Zielansicht-Ressource mit einem R8G8B8A8_UINT-Format rendern und dann den Inhalt in eine andere Ressource mit einem R8G8B8A8_UNORM Datenformat auflösen.

Hardwareunterstützung

Die API meldet die Hardwareunterstützung für Multisampling anhand der Anzahl von Qualitätsstufen. Ein Qualitätslevel 0 bedeutet beispielsweise, dass die Hardware Multisampling (bei einer bestimmten Format- und Qualitätsstufe) nicht unterstützt. Eine 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 _UNORM, _SRGB, _SNORM oder _FLOAT Formate verfügt, unterstützt auch die Auflösung.

Zentrierte Stichprobenentnahme von Attributen bei Multisampel-Antialiasing

Standardmäßig werden Vertexattribute während der Multisampel-Antialiasing zu einem Pixelpunkt interpoliert. wenn das Pixelzentrum nicht abgedeckt ist, werden Attribute auf ein Pixelzentrum extrapoliert. Wenn eine Pixel-Shadereingabe, die die zentrierte Semantik enthält (vorausgesetzt, das Pixel ist nicht vollständig abgedeckt) wird irgendwo innerhalb des abgedeckten Bereichs des Pixels stichprobeniert, möglicherweise an einem der abgedeckten Stichprobenstandorte. Vor der Zentrierungsberechnung wird eine Beispielmaske (durch den Rasterisierungszustand angegeben) angewendet. Daher wird ein maskiertes Beispiel nicht als zentrierte Position verwendet.

Der Verweisrasterer wählt einen Beispielspeicherort für die Kernstichprobe wie folgt aus:

  • Die Beispielmaske lässt alle Beispiele zu. Verwenden Sie ein Pixelzentrum, wenn das Pixel abgedeckt ist oder wenn keines der Beispiele abgedeckt ist. Andernfalls wird das erste abgedeckte Beispiel ausgewählt, beginnend mit der Pixelmitte und der Bewegung nach außen.
  • Die Beispielmaske deaktiviert alle Beispiele bis auf eins (ein gängiges Szenario). Eine Anwendung kann multipass-Supersampling implementieren, indem sie die Einzelbit-Sample-Mask-Werte durchläuft und die Szene für jedes Beispiel mithilfe von Centroid Sampling erneut rendert. Dies erfordert, dass eine Anwendung Ableitungen anpasst, um entsprechend detailliertere Textur-Mips für die höhere Textur-Stichprobendichte auszuwählen.

Abgeleitete Berechnungen beim Multisampling

Pixel-Shader werden immer mit einem Mindestbereich von 2 x 2 Pixel ausgeführt, um abgeleitete Berechnungen zu unterstützen. Diese werden berechnet, indem Deltas zwischen Daten aus benachbarten Pixeln verwendet werden (wobei davon ausgegangen wird, dass die Daten in jedem Pixel mit einem horizontalen oder vertikalen Einheitsabstand erfasst wurden). Dies ist vom Multisampling nicht betroffen.

Wenn Ableitungen für ein Attribut angefordert werden, das mit dem Zentroid abgetastet wurde, wird die Hardwareberechnung nicht angepasst, was zu ungenauen Ableitungen führen kann. Ein Shader erwartet einen Einheitsvektor im Render-Zielraum, erhält jedoch möglicherweise einen Nicht-Einheitsvektor in Bezug auf einen anderen Vektorraum. Daher liegt es in der Verantwortung einer Anwendung, bei der Anforderung von Ableitungen von Attributen, die zentriert stichprobeniert sind, Vorsicht walten zu lassen.

In der Tat wird empfohlen, keine Derivate und zentrieren Stichprobenentnahmen zu kombinieren. Die zentrierte Stichprobenentnahme kann für Situationen nützlich sein, in denen es wichtig ist, dass die interpolierten Attribute eines Primitiven nicht extrapoliert werden, aber dies kommt mit Kompromissen wie Attributen, die zu springen scheinen, wenn ein primitiver Rand ein Pixel kreuzt (anstatt sich kontinuierlich zu ändern), oder Ableitungen, die nicht von Textursamplingsvorgängen verwendet werden können, die LOD ableiten.

Anhänge

Rasterizerphase (RS)