Ausgabezusammenführungsphase (OM)
Die Ausgabezusammenführungsphase (OUTPUT Merger, OM) kombiniert verschiedene Arten von Ausgabedaten (Pixelshaderwerte, Tiefen- und Schabloneninformationen) mit dem Inhalt des Renderziel- und Tiefen-/Schablonenpuffers, um das endgültige Pipelineergebnis zu generieren.
Zweck und Verwendung
Die Ausgabezusammenführungsphase (OUTPUT Merger, OM) ist der letzte Schritt, um zu bestimmen, welche Pixel (mit Tiefenschablonentests) sichtbar sind, und die endgültigen Pixelfarben zu mischen.
In der OM-Phase wird die endgültige gerenderte Pixelfarbe mithilfe einer Kombination aus folgendem Generiert:
- Pipeline-Status
- Die von den Pixelshadern generierten Pixeldaten
- Der Inhalt der Renderziele
- Der Inhalt der Tiefen-/Schablonenpuffer.
Ü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.
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 zur Verwendung der API zum Erstellen und Festlegen des Blend-Zustands finden Sie unter Configuring Blending Functionality.
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.
Farbmischung aus dualer Quelle
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. 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.
Übersicht über Tiefenschablonentests
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.
Informationen zum Konfigurieren von Tiefenschablonentests finden Sie unter Konfigurieren der Tiefenschablonenfunktionalitä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.
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.
Übersicht über Beispielmasken
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).
Eingabe
Die Ausgabezusammenführungsstufe (OM) generiert die endgültige gerenderte Pixelfarbe mithilfe einer Kombination aus folgendem:
- Pipeline-Status
- Die von den Pixelshadern generierten Pixeldaten
- Der Inhalt der Renderziele
- Der Inhalt der Tiefen-/Schablonenpuffer.
Ausgabe
Übersicht über das Ausgabeschreibformat
Verwenden Sie ein Ausgabeschreibformat, um zu steuern (pro Komponente), welche Daten in ein Renderziel geschrieben werden können.
Übersicht über mehrere Renderziele
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.
In diesem Abschnitt
Thema | Beschreibung |
---|---|
In diesem Abschnitt werden die Schritte zum Einrichten des Tiefenschablonenpuffers und des Tiefenschablonenzustands für die Ausgabezusammenführungsphase behandelt. |
Verwandte Themen