Est-il possible de mélanger alpha plusieurs cibles de rendu en utilisant un alpha spécifié?

9

Disons que j'ai des cibles de rendu 0 à N et RT 0 se trouve avoir dans son quatrième composant un canal alpha spécifié par un matériau ou un masque ou quelque chose.

Est-il possible que le compositeur matériel mélange les cibles de rendu 1 à N en utilisant l'alpha de la première cible de rendu?

jeremyong
la source

Réponses:

5

Pour autant que je sache, il n'y a aucun moyen dans DX ou GL de réutiliser l'alpha de RT 0 pour toutes les opérations de mélange. Malheureusement, cela ne semble pas être pris en charge par le matériel.

Vous pouvez configurer différents modes de fusion pour chaque cible de rendu, ou activer la fusion pour certains et désactiver pour d'autres; cependant, si le mélange est activé pour une cible de rendu, il utilise toujours son propre alpha.

Il existe également un mode appelé "mélange à double source" (voir doc DX11 et doc OGL ), qui vous permet de spécifier l'alpha pour le mélange avec une sortie entièrement distincte du pixel shader, pas le canal alpha de la cible de rendu. Cependant, ce mode ne fonctionne qu'avec une seule cible de rendu sur le matériel actuel.

Donc, pour autant que je sache, les seules options pour mélanger plusieurs cibles de rendu avec le même alpha sont:

  • Afficher le même alpha sur toutes les cibles de rendu (sacrifiant la possibilité de stocker d'autres valeurs dans le canal alpha comme vous le feriez dans un ombrage différé, par exemple).
  • Répétez le rendu dans une passe distincte pour chaque cible de rendu, en utilisant le mélange à double source.
  • Utilisez des UAV / magasin de chargement d'image pour exécuter le mélange dans le pixel shader (ne fonctionne que si la géométrie ne se chevauche pas automatiquement dans l'espace de l'écran, car il n'y a pas de protection contre les conditions de concurrence; également probablement un peu lent).
  • Sur le matériel qui le prend en charge, DX11.3 / DX12 Rasterizer-Order Views , NV_fragment_shader_interlock ou INTEL_fragment_shader_ordering (ce dernier étant également exposé par les GPU AMD). Ce sont trois noms pour la même chose: fondamentalement une "section critique" dans le pixel shader qui vous permet de lire-modifier-écrire une texture atomiquement par rapport aux autres invocations de pixel shader. Il permet essentiellement un mélange programmable arbitraire, mais il est probablement assez lent et n'est disponible que sur du matériel récent.
Nathan Reed
la source
Oui, je pense que c'était aussi ma conclusion. Savez-vous si c'est le cas avec DX12 ou Vulkan (inédit)? Il a de très grandes applications pour le rendu différé comme vous l'avez mentionné et aucune des alternatives existantes ne semble satisfaisante à l'heure actuelle.
jeremyong
@jeremyong Désolé, je ne pense pas qu'il y ait de changements dans les opérations de mélange dans DX12. Je ne suis pas sûr de Vulkan, mais je serais surpris; le matériel de mélange n'a pas changé. FWIW, dans les jeux sur lesquels j'ai travaillé, nous avons fait une variante de la puce # 3 pour les décalcomanies différées, et prétraité la géométrie pour la séparer en groupes ne se chevauchant pas.
Nathan Reed
Gotcha merci pour la recommandation. Les décalcomanies différées sont précisément ce que
j'implémente