Ist es möglich, mehrere Renderziele mit einem bestimmten Alpha zu mischen?

9

Angenommen, ich habe Renderziele 0 bis N und RT 0 hat in seiner vierten Komponente zufällig einen Alphakanal, der durch ein Material oder eine Maske oder etwas anderes angegeben ist.

Ist es möglich, dass der Hardware-Compositor die Renderziele 1 bis N mit dem Alpha des ersten Renderziels mischt?

jeremyong
quelle

Antworten:

5

Soweit mir bekannt ist, gibt es weder in DX noch in GL eine Möglichkeit, das Alpha von RT 0 für alle Mischvorgänge wiederzuverwenden. Leider scheint es nicht etwas zu sein, das von Hardware unterstützt wird.

Sie können verschiedene Mischmodi für jedes Renderziel konfigurieren oder das Mischen für einige aktivieren und für andere deaktivieren. Wenn jedoch das Mischen für ein Renderziel aktiviert ist, wird immer ein eigenes Alpha verwendet.

Es gibt auch einen Modus namens "Dual-Source-Blending" (siehe DX11-Dokument und OGL-Dokument ), mit dem Sie das Alpha für das Mischen mit einer völlig separaten Ausgabe vom Pixel-Shader und nicht vom Alpha-Kanal des Rendering-Ziels angeben können. Dieser Modus funktioniert jedoch nur mit einem Renderziel auf der aktuellen Hardware.

Soweit ich das beurteilen kann, sind die einzigen Optionen zum Mischen mehrerer Renderziele mit demselben Alpha:

  • Geben Sie auf allen Renderzielen dasselbe Alpha aus (opfern Sie die Möglichkeit, andere Werte im Alphakanal zu speichern, wie Sie es beispielsweise bei verzögerter Schattierung tun würden).
  • Wiederholen Sie das Rendern in einem separaten Durchgang für jedes Renderziel mithilfe der Dual-Source-Mischung.
  • Verwenden Sie UAVs / Image Load-Store, um die Überblendung im Pixel-Shader auszuführen (funktioniert nur, wenn sich die Geometrie im Bildschirmbereich nicht selbst überlappt, da kein Schutz gegen Rennbedingungen besteht; wahrscheinlich auch etwas langsam).
  • Auf Hardware, die dies unterstützt, DX11.3 / DX12 Rasterizer-Order Views , NV_fragment_shader_interlock oder INTEL_fragment_shader_ordering (letzteres wird auch von AMD-GPUs verfügbar gemacht ). Dies sind drei Namen für dasselbe: Im Grunde genommen ein "kritischer Abschnitt" im Pixel-Shader, mit dem Sie eine Textur in Bezug auf andere Pixel-Shader-Aufrufe atomar lesen, ändern und schreiben können. Es ermöglicht im Wesentlichen ein beliebiges programmierbares Mischen, ist jedoch wahrscheinlich ziemlich langsam und nur auf neuerer Hardware verfügbar.
Nathan Reed
quelle
Ja, ich denke das war auch meine Schlussfolgerung. Wissen Sie sofort, ob dies bei DX12 oder (dem unveröffentlichten) Vulkan der Fall ist? Wie Sie bereits erwähnt haben, gibt es ziemlich große Anwendungen für verzögertes Rendern, und keine der derzeit vorhandenen Alternativen scheint zufriedenstellend zu sein.
Jeremyong
@jeremyong Entschuldigung, ich glaube nicht, dass es Änderungen an Mischvorgängen in DX12 gibt. Ich bin mir nicht sicher über Vulkan, aber ich wäre überrascht. Die Mischhardware hat sich nicht geändert. FWIW, in Spielen, an denen ich gearbeitet habe, haben wir eine Variante von Punkt 3 für verzögerte Abziehbilder erstellt und die Geometrie vorverarbeitet, um sie in nicht überlappende Gruppen zu unterteilen.
Nathan Reed
Gotcha danke für die Empfehlung. Aufgeschobene Abziehbilder sind genau das, was ich implementiere
Jeremyong