Output-Merger Phase

Die Om-Phase (Output-Merger) generiert die endgültige gerenderte Pixelfarbe mithilfe einer Kombination aus dem Pipelinezustand, den von den Pixelshadern generierten Pixeldaten, dem Inhalt der Renderziele und dem Inhalt der Tiefen-/Schablonenpuffer. Die OM-Phase ist der letzte Schritt zum Bestimmen der sichtbaren Pixel (mit Tiefenschablonentests) und zum Mischen der endgültigen Pixelfarben.

Unterschiede zwischen Direct3D 9 und Direct3D 10:

  • Direct3D 9 implementiert Alphatests (unter Verwendung des Alphateststatus), um zu steuern, ob ein Pixel in ein Ausgaberenderingziel geschrieben wird.
  • Direct3D 10 und höher implementiert keinen Alphatest (oder Alphateststatus). Dies kann mithilfe eines Pixelshaders oder mit Tiefen-/Schablonenfunktionen gesteuert werden.

Übersicht über Depth-Stencil-Tests

Ein Tiefenschablonenpuffer, der als Texturressource erstellt wird, kann sowohl Tiefendaten als auch Schablonendaten enthalten. Die Tiefendaten werden verwendet, um zu bestimmen, welche Pixel der Kamera am nächsten liegen, und die Schablonendaten werden verwendet, um zu maskieren, welche Pixel aktualisiert werden können. Letztendlich werden sowohl die Daten für die Tiefe als auch die Schablonenwerte von der Ausgabezusammenführungsphase verwendet, um zu bestimmen, ob ein Pixel gezeichnet werden soll oder nicht. Das folgende Diagramm zeigt konzeptionell, wie Tiefenschablonentests durchgeführt werden.

Diagramm der Funktionsweise von Tiefenschablonentests

Informationen zum Konfigurieren von Tiefenschablonentests finden Sie unter Konfigurieren Depth-Stencil Funktionalität. Ein Tiefenschablonenobjekt kapselt den Tiefenschablonenzustand. Eine Anwendung kann den Tiefenschablonenzustand angeben, oder die OM-Phase verwendet Standardwerte. Füllvorgänge werden pro Pixel ausgeführt, wenn Multisampling deaktiviert ist. Wenn Multisampling aktiviert ist, erfolgt die Vermischung pro Multisampelbasis.

Der Prozess der Verwendung des Tiefenpuffers, um zu bestimmen, welches Pixel gezeichnet werden soll, wird als Tiefenpufferung bezeichnet, manchmal auch als Z-Pufferung bezeichnet.

Sobald Tiefenwerte die Ausgabe-Merger-Phase erreichen (unabhängig davon, ob sie von der Interpolation oder von einem Pixel-Shader stammen), werden sie immer eingespannt: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) entsprechend dem Format/der Genauigkeit des Tiefenpuffers unter Verwendung von Gleitkommaregeln. Nach dem Spannen wird der Tiefenwert (mit DepthFunc) mit dem vorhandenen Tiefenpufferwert verglichen. Wenn kein Tiefenpuffer gebunden ist, besteht der Tiefentest immer.

Wenn keine Schablonenkomponente im Tiefenpufferformat oder kein Tiefenpuffer gebunden ist, besteht der Schablonentest immer. Andernfalls bleibt die Funktionalität gegenüber Direct3D 9 unverändert.

Es kann jeweils nur ein Tiefen-/Schablonenpuffer aktiv sein. Alle gebundenen Ressourcenansichten müssen der Tiefen-/Schablonenansicht (gleiche Größe und Größe) entsprechen. Dies bedeutet nicht, dass die Ressourcengröße übereinstimmen muss, nur dass die Ansichtsgröße übereinstimmen muss.

Weitere Informationen zum Testen von Tiefenschablonen finden Sie im Tutorial 14.

Übersicht über das Blending

Beim Mischen wird ein oder mehrere Pixelwerte kombiniert, um eine endgültige Pixelfarbe zu erstellen. Das folgende Diagramm zeigt den Prozess, der beim Mischen von Pixeldaten erforderlich ist.

Diagramm der Funktionsweise der Datenmischung

Konzeptionell können Sie dieses Flussdiagramm visualisieren, das in der Ausgabe-Fusionsphase zweimal implementiert wurde: Das erste blendet RGB-Daten, während parallel ein zweites Alphadaten mischt. Informationen zum Erstellen und Festlegen des Mischzustands mithilfe der API finden Sie unter Konfigurieren der Blendingfunktionalität.

Fixed-Function Blend kann unabhängig für jedes Renderziel aktiviert werden. Es gibt jedoch nur einen Satz von Blend-Steuerelementen, sodass die gleiche Mischung auf alle RenderTargets angewendet wird, wobei das Blenden aktiviert ist. Blendwerte (einschließlich BlendFactor) werden vor dem Mischen immer in den Bereich des Renderzielformats eingespannt. Die Klemmung erfolgt pro Renderziel unter Berücksichtigung des Renderzieltyps. Die einzige Ausnahme besteht bei den Formaten float16, float11 oder float10, die nicht geklemmt sind, sodass Blendvorgänge für diese Formate mit mindestens der gleichen Genauigkeit/des gleichen Bereichs wie das Ausgabeformat ausgeführt werden können. NaNs und signierte Nullen werden für alle Fälle (einschließlich 0,0 Mischgewichtungen) weitergegeben.

Wenn Sie sRGB-Renderziele verwenden, konvertiert die Laufzeit die Renderzielfarbe in einen linearen Raum, bevor sie eine Mischung durchführt. Die Runtime konvertiert den endgültigen gemischten Wert wieder in sRGB-Speicherplatz, bevor der Wert wieder im Renderziel gespeichert wird.

Unterschiede zwischen Direct3D 9 und Direct3D 10:

  • In Direct3D 9 kann die Mischung mit festen Funktionen unabhängig für jedes Renderziel aktiviert werden.
  • In Direct3D 10 und höher gibt es eine Beschreibung des Mischzustands; Daher kann für alle Renderziele ein Mischwert festgelegt werden.

Dual-Source Farbmischung

Dieses Feature ermöglicht es der Ausgabezusammenführungsphase, beide Pixelshaderausgaben (o0 und o1) gleichzeitig als Eingaben für einen Mischvorgang mit dem einzelnen Renderziel an Slot 0 zu verwenden. Gültige Mischvorgänge sind: add, subtrahieren und revsubtract. Gültige Mischoptionen für SrcBlend, DestBlend, SrcBlendAlpha oder DestBlendAlpha sind: D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA. Die Mischungsgleichung und die Ausgabeschreibmaske geben an, welche Komponenten der Pixelshader ausgibt. Zusätzliche Komponenten werden ignoriert.

Das Schreiben in andere Pixelshaderausgaben (o2, o3 usw.) ist undefiniert; Sie dürfen nicht in ein Renderziel schreiben, wenn es nicht an Slot 0 gebunden ist. Das Schreiben von oDepth ist während der Dual-Quellfarbmischung gültig.

Beispiele finden Sie unter Mischen von Pixelshaderausgaben.

Übersicht über mehrere RenderTargets

Ein Pixelshader kann verwendet werden, um mindestens 8 separate Renderziele zu rendern, die alle denselben Typ aufweisen müssen (puffer, Texture1D, Texture1DArray usw.). Darüber hinaus müssen alle Renderziele in allen Dimensionen (Breite, Höhe, Tiefe, Arraygröße, Stichprobenanzahl) die gleiche Größe aufweisen. Jedes Renderziel kann ein anderes Datenformat aufweisen.

Sie können eine beliebige Kombination von Renderzielslots (bis zu 8) verwenden. Eine Ressourcenansicht kann jedoch nicht gleichzeitig an mehrere Renderzielslots gebunden werden. Eine Ansicht kann wiederverwendet werden, solange die Ressourcen nicht gleichzeitig verwendet werden.

Übersicht über Output-Write Masken

Verwenden Sie eine Ausgabe-/Schreibmaske, um (pro Komponente) zu steuern, welche Daten in ein Renderziel geschrieben werden können.

Übersicht über Die Beispielmaske

Eine Beispielmaske ist eine 32-Bit-Multisample-Abdeckungsmaske, die bestimmt, welche Beispiele in aktiven Renderzielen aktualisiert werden. Es ist nur eine Beispielmaske zulässig. Die Zuordnung von Bits in einer Beispielmaske zu den Beispielen in einer Ressource wird von einem Benutzer definiert. Für das n-Sample-Rendering werden die ersten n Bits (aus dem LSB) der Beispielmaske verwendet (32 Bits die maximale Anzahl von Bits).

In diesem Abschnitt

Thema Beschreibung
Konfigurieren der Depth-Stencil-Funktionalität
In diesem Abschnitt werden die Schritte zum Einrichten des Tiefenschablonenpuffers und des Tiefenschablonenzustands für die Output-Merger-Phase beschrieben.
Konfigurieren von Blendingfunktionen
Füllvorgänge werden für jede Pixelshaderausgabe (RGBA-Wert) ausgeführt, bevor der Ausgabewert in ein Renderziel geschrieben wird. Wenn Multisampling aktiviert ist, erfolgt das Mischen für jede Multisampel. Andernfalls wird für jedes Pixel eine Überblendung durchgeführt.
Tiefenausrichtung
Polygone, die im 3D-Raum koplanar sind, können so aussehen, als ob sie nicht koplanar sind, indem sie jeweils eine Z-Verzerrung (oder Tiefenverzerrung) hinzufügen.

Grafikpipeline

Pipelinephasen (Direct3D 10)