Freigeben über


Output-Merger Phase

Die Ausgabezusammenführungsstufe (OM) generiert die endgültige gerenderte Pixelfarbe mithilfe einer Kombination aus Pipelinestatus, den Pixeldaten, die von den Pixelshadern generierten Pixeldaten, den Inhalt der Renderziele und den Inhalt der Tiefen-/Schablonenpuffer. Die OM-Phase ist der letzte Schritt, um zu bestimmen, welche Pixel sichtbar sind (mit Tiefenschablonentests) und das Mischen der endgültigen Pixelfarben.

Unterschiede zwischen Direct3D 9 und Direct3D 10:

  • Direct3D 9 implementiert Alphatests (mit Alphateststatus), um zu steuern, ob ein Pixel in ein Ausgaberenderziel geschrieben wird.
  • Direct3D 10 und höher implementieren keinen Alphatest (oder Alphateststatus). Dies kann mit einem Pixelshader oder mit Tiefen-/Schablonenfunktionen gesteuert werden.

Depth-Stencil Testübersicht

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 Tiefen- als auch die Schablonenwerte von der Ausgabezusammenführungsphase verwendet, um festzustellen, ob ein Pixel gezeichnet werden soll. Das folgende Diagramm zeigt, wie Tiefenschablonentests durchgeführt werden.

Diagramm der Funktionsweise von Tiefenschablonentests

Informationen zum Konfigurieren von Tiefenschablonentests finden Sie unter Konfigurieren von Depth-Stencil Funktionalität. Ein Tiefenschablonenobjekt kapselt den Tiefenschablonenzustand. Eine Anwendung kann den Tiefenschablonenzustand angeben, oder die OM-Stufe verwendet Standardwerte. Vermischungsvorgänge werden pro Pixel ausgeführt, wenn Multisampling deaktiviert ist. Wenn Multisampling aktiviert ist, erfolgt die Vermischung pro Multisample.If multisampling is enabled, blending is a per multisample.

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

Sobald Tiefenwerte die Ausgabezusammenführungsphase erreicht haben (unabhängig davon, ob sie aus der Interpolation oder aus einem Pixelshader stammen), werden sie immer eingeklemmt: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) gemäß dem Format/der Genauigkeit des Tiefenpuffers, wobei Gleitkommaregeln verwendet werden. Nach der Klammerung wird der Tiefenwert (unter Verwendung von DepthFunc) mit dem vorhandenen Tiefenpufferwert verglichen. Wenn kein Tiefenpuffer gebunden ist, besteht der Tiefentest immer.

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

Es kann jeweils nur ein Tiefen-/Schablonenpuffer aktiv sein; jede gebundene Ressourcenansicht muss mit der Tiefen-/Schablonenansicht (gleiche Größe und Dimensionen) übereinstimmen. Dies bedeutet nicht, dass die Ressourcengröße übereinstimmen muss, nur dass die Ansichtsgröße übereinstimmen muss.

Weitere Informationen zu Tiefenschablonentests finden Sie in Lernprogramm 14.

Übersicht über die Blendung

Beim Blenden werden mindestens ein Pixelwert kombiniert, um eine endgültige Pixelfarbe zu erstellen. Das folgende Diagramm zeigt den Prozess, der bei der Vermischung von Pixeldaten beteiligt ist.

Diagramm der Funktionsweise von Daten

Konzeptionell können Sie dieses Flussdiagramm visualisieren, das zweimal in der Ausgabezusammenführungsphase implementiert wird: Die erste blendet RGB-Daten zusammen, während parallel eine zweite Alphadaten kombiniert. Informationen zum Erstellen und Festlegen des Blendstatus mithilfe der API finden Sie unter Konfigurieren von Blending-Funktionalität.

Feste Funktionsmischung kann für jedes Renderziel unabhängig voneinander aktiviert werden. Es gibt jedoch nur einen Satz von Blend-Steuerelementen, sodass dasselbe Blend auf alle RenderTargets angewendet wird, wobei die Blendung aktiviert ist. Blendwerte (einschließlich BlendFactor) werden vor der Vermischung immer an den Bereich des Renderzielformats geklammert. Die Klammerung erfolgt pro Renderziel, wobei der Renderzieltyp berücksichtigt wird. Die einzige Ausnahme ist für die Formate float16, float11 oder float10, die nicht geklammert sind, sodass Mischvorgänge in diesen Formaten mit mindestens gleicher Genauigkeit/Bereich wie das Ausgabeformat durchgeführt werden können. NaNs und signierte Nullen werden für alle Fälle verteilt (einschließlich 0,0 Mischgewichte).

Wenn Sie sRGB-Renderziele verwenden, konvertiert die Laufzeit die Renderzielfarbe in einen linearen Raum, bevor die Vermischung durchgeführt wird. Die Laufzeit 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 können feste Funktionsvermischungen für jedes Renderziel unabhängig voneinander aktiviert werden.
  • In Direct3D 10 und höher gibt es eine Beschreibung des Mischzustands; Daher kann ein Mischwert für alle Renderziele festgelegt werden.

Dual-Source Farbmischung

Mit diesem Feature kann die Ausgabezusammenführungsphase beide Pixel-Shader-Ausgaben (o0 und o1) gleichzeitig als Eingaben für einen Vermischungsvorgang mit dem einzelnen Renderziel an Slot 0 verwenden. Gültige Blend-Operationen umfassen: Addieren, Subtrahieren und Revsubtract. Gültige Mischungsoptionen 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 Gleichung "Blend" und das Ausgabeschreibformat geben an, welche Komponenten der Pixelshader ausgegeben wird. Zusätzliche Komponenten werden ignoriert.

Das Schreiben in andere Pixelshaderausgaben (o2, o3 usw.) ist nicht definiert; Sie dürfen nicht in ein Renderziel schreiben, wenn es nicht an slot 0 gebunden ist. Das Schreiben von oDepth ist während der Farbmischung mit dualer Quelle gültig.

Beispiele finden Sie unter Vermischung von Pixel-Shader-Ausgaben.

Ü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 dieselbe Größe aufweisen (Breite, Höhe, Tiefe, Arraygröße, Stichprobenanzahl). Jedes Renderziel verfügt möglicherweise über ein anderes Datenformat.

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

übersicht über Output-Write Maske

Verwenden Sie ein Ausgabeschreibformat, um zu steuern (pro Komponente), welche Daten in ein Renderziel geschrieben werden können.

Beispielmaske ( Übersicht)

Bei einer Beispielmaske handelt es sich um ein 32-Bit-Multisample-Abdeckungsformat, das 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-Beispielrendering werden die ersten n Bits (aus dem LSB) des Beispielformats verwendet (32 Bits die maximale Anzahl von Bits).

In diesem Abschnitt

Thema Beschreibung
Konfigurieren Depth-Stencil Funktionalität
In diesem Abschnitt werden die Schritte zum Einrichten des Tiefenschablonenpuffers und des Tiefenschablonenzustands für die Ausgabezusammenführungsphase behandelt.
Konfigurieren von Blending-Funktionen
Vermischungsvorgänge werden für jede Pixelshaderausgabe (RGBA-Wert) ausgeführt, bevor der Ausgabewert in ein Renderziel geschrieben wird. Wenn Multisampling aktiviert ist, erfolgt die Vermischung auf jedem Multisample; andernfalls wird die Vermischung für jedes Pixel ausgeführt.
Tiefenverzerrung
Polygone, die im 3D-Raum koplanar sind, können so aussehen, als ob sie nicht koplanar sind, indem sie jeweils einen Z-Bias (oder tiefenvoreingenommen) hinzufügen.

Grafikpipeline-

Pipelinephasen (Direct3D 10)