Freigeben über


Rasterungsregeln

Rasterungsregeln definieren, wie Vektordaten Rasterdaten zugeordnet werden. Die Rasterdaten werden an ganzzahligen Speicherorten angedockt, die dann gekullt und beschnitten werden (um die Mindestanzahl von Pixeln zu zeichnen), und attribute pro Pixel werden interpoliert (aus den Attributen pro Vertex), bevor sie an einen Pixelshader ü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)

Jede Pixelmitte, die in ein Dreieck fällt, wird gezeichnet; Es wird davon ausgegangen, dass sich ein Pixel innerhalb befindet, wenn es die Oben-Links-Regel übergibt. Die Regel oben links ist, dass ein Pixelmittelpunkt so definiert ist, dass er innerhalb eines Dreiecks liegt, wenn es am oberen Rand oder am linken Rand eines Dreiecks liegt.

Hierbei gilt:

  • Ein oberer Rand 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 einen oder zwei linke Ränder aufweisen.

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

Diese Abbildung zeigt Beispiele für Pixel, die gezeichnet werden, weil sie entweder innerhalb eines Dreiecks liegen oder der Regel oben links folgen.

Abbildung von Beispielen für die Dreiecksrasterung oben links

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)

Linienrasterregeln verwenden einen Rautentestbereich, um zu bestimmen, ob eine Linie ein Pixel bedeckt. Bei x-Hauptlinien (Linien mit -1 <= Steigung <= +1) umfasst der Diamanttestbereich (als Vollton dargestellt) den unteren linken Rand, den unteren rechten Rand und die untere Ecke; der Diamant schließt (gepunktet dargestellt) den oberen linken Rand, den oberen rechten Rand, den oberen Rand, die obere Ecke, 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 dass die rechte Ecke ebenfalls enthalten ist.

Angesichts des Rautenbereichs deckt eine Linie ein Pixel ab, wenn die Linie den Rautentestbereich des Pixels verlässt, wenn sie vom Anfang bis zum 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.

Abbildung von Beispielen für die Rasterung von Aliaslinien

Linienrasterregeln (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-Coverage-Werte erzeugt, die in Pixelshader-Ausgabe-Alphakomponenten multipliziert werden. Beim Zeichnen von Linien auf einem multisampledigen Renderziel ist keine Antialiasingvorformung vorhanden.

Es wird davon ausgegangen, dass es keine einzige "beste" Möglichkeit gibt, antialiased Line Rendering durchzuführen. Direct3D 10 verwendet die in der folgenden Abbildung gezeigte Methode als Richtschnur. Diese Methode wurde empirisch abgeleitet und weist eine Reihe von visuellen Eigenschaften auf, die als wünschenswert angesehen werden. Hardware muss nicht genau mit diesem Algorithmus übereinstimmen; Tests mit diesem Verweis müssen "angemessene" Toleranzen aufweisen, die sich an einigen weiter unten aufgeführten Prinzipien orientieren, die verschiedene Hardwareimplementierungen und Filterkernkerngrößen zulassen. Keine dieser Flexibilität, die bei der Hardwareimplementierung zulässig ist, kann jedoch über Direct3D 10 an Anwendungen kommuniziert werden, über das einfache Zeichnen von Linien und das Beobachten/Messen derEn Aussehen hinaus.

Abbildung von Beispielen für antialiasierte Linienrasterung

Dieser Algorithmus erzeugt relativ glatte Linien mit einheitlicher Intensität, mit minimalen gezackten Kanten oder Zöpfungen. Die Moire-Musterung für enge Linien wird minimiert. Es gibt eine gute Abdeckung für Verbindungen zwischen End-to-End-Streckensegmenten. Der Filterkern ist ein vernünftiger Kompromiss zwischen dem Umfang der Kantenunschärfe und den Änderungen in der Intensität, die durch Gammakorrekturen verursacht werden. Der Coverage-Wert wird in pixel shader o0.a (srcAlpha) gemäß der folgenden Formel durch die Ausgabezusammenführungsstufe 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 Dreieckrasterregeln verwenden. Die Koordinate identifiziert den Mittelpunkt eines ein Pixel breiten Quadrats. Es gibt kein Culling für Punkte.

Die folgende Abbildung zeigt einige Beispiele.

Abbildung von Beispielen für die Punktrasterung

Rasterungsregeln für Multisample-Antialiasing

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

Die folgende Abbildung zeigt einige Beispiele.

Abbildung von Beispielen für die Multisample-Antialias-Rasterung

Die Anzahl der Beispielspeicherorte hängt vom Multisample-Modus ab. Vertexattribute werden in Pixelzentren interpoliert, da hier der Pixelshader aufgerufen wird (dies wird zur Extrapolation, wenn die Mitte nicht abgedeckt ist). Attribute können im Pixelshader gekennzeichnet werden, um den Schwerpunkt abzutasten, wodurch 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 angezeigt wird, um die mindestens 2x2-Quantas auszufüllen (was unabhängig vom Multisampling ist). Das Shaderergebnis wird für jedes abgedeckte Beispiel ausgeschrieben, das den Tiefenschablonentest pro Stichprobe besteht.

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

  • Für ein Dreieck wird ein Abdeckungstest für jede Beispielposition (nicht für einen Pixelkern) durchgeführt. Wenn mehr als eine Beispielposition abgedeckt wird, wird ein Pixelshader einmal mit attributen ausgeführt, die in der Pixelmitte interpoliert sind. Das Ergebnis wird für jede abgedeckte Stichprobenposition im 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 für jeden Beispielstandort (nicht für ein Pixelcenter) ein Abdeckungstest 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 Mehrfachsamplingformat auf eine Beispielgröße von 1 herunterstempelt wird). Multisampling-Formate können in Renderzielen verwendet werden, die mithilfe des Ladevorgangs 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 Multisample-Ressourcen nicht unterstützt, daher sind Tiefenformate nur auf Renderziele beschränkt.

Typlose Formate (R8G8B8A8_TYPELESS für instance) unterstützen Multisampling, damit eine Ressourcenansicht Daten auf unterschiedliche Weise interpretieren kann. Für instance können Sie mithilfe von R8G8B8A8_TYPELESS eine Multisampleressource erstellen, sie mithilfe einer Renderzielansichtsressource 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 über die Anzahl der Qualitätsstufen. Eine Qualitätsstufe 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 formate _UNORM, _SRGB, _SNORM oder _FLOAT verfügt, unterstützt ebenfalls das Auflösen.

Schwerpunktsampling von Attributen bei Multisample Antialiasing

Vertexattribute werden standardmäßig während der Multisample-Antialiasing zu einem Pixelmittelpunkt interpoliert. Wenn der Pixelmittelpunkt nicht abgedeckt ist, werden Attribute zu einem Pixelmittelpunkt extrapoliert. Wenn eine Pixelshadereingabe, die die Schwerpunktsemantik enthält (vorausgesetzt, das Pixel ist nicht vollständig abgedeckt), wird irgendwo innerhalb des abgedeckten Bereichs des Pixels, möglicherweise an einer der abgedeckten Stichprobenspeicherorte, stichprobeniert. Eine Beispielmaske (angegeben durch den Rasterisierungszustand) wird vor der Berechnung des Schwerpunkts angewendet. Daher wird ein Beispiel, das maskiert ist, nicht als Schwerpunktspeicherort verwendet.

Der Referenzrasterizer wählt einen Beispielspeicherort für die Kernsampling wie folgt aus:

  • Die Beispielmaske lässt alle Beispiele zu. Verwenden Sie ein Pixelcenter, 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 außer einem Beispiel (ein häufiges 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 Schwerpunktsampling neu gerendert wird. Dies erfordert, dass eine Anwendung Ableitungen anpasst, um entsprechend detailliertere Textur-Mips für die höhere Textur-Samplingdichte auszuwählen.

Abgeleitete Berechnungen beim Multisampling

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

Wenn Derivate für ein Attribut angefordert werden, das mit dem Schwerpunkt stichprobeniert wurde, wird die Hardwareberechnung nicht angepasst, was zu ungenauen Ableitungen führen kann. Ein Shader erwartet einen Einheitsvektor im Renderzielbereich, erhält aber möglicherweise einen Nicht-Einheitsvektor in Bezug auf einen anderen Vektorraum. Daher liegt es in der Verantwortung einer Anwendung, vorsichtig zu sein, wenn Ableitungen von Attributen angefordert werden, die schwerpunktsampiert sind. Tatsächlich wird empfohlen, Derivate und Schwerpunktsampling nicht zu kombinieren. Das Sampling von Schwerpunkten kann für Situationen nützlich sein, in denen es wichtig ist, dass die interpolierten Attribute eines Grundtyps nicht extrapoliert werden. Dies bringt jedoch Kompromisse mit sich, z. B. Attribute, die zu springen scheinen, wenn ein primitiver Rand ein Pixel durchquert (anstatt sich kontinuierlich zu ändern), oder Ableitungen, die nicht von Textursamplingsvorgängen verwendet werden können, die LOD ableiten.

Stufe des Rasterizers