Tanto quanto sei, não há como, no DX ou no GL, reutilizar o alfa do RT 0 para todas as operações de mistura. Infelizmente, não parece ser algo suportado por hardware.
Você pode configurar diferentes modos de mesclagem para cada destino de renderização ou ativar a mesclagem para alguns e desativar para outros; no entanto, se a mistura estiver ativada para um destino de renderização, ela sempre usará seu próprio alfa.
Há também um modo chamado "mistura de fonte dupla" (consulte o documento DX11 e o documento OGL ), que permite especificar o alfa para mistura com uma saída totalmente separada do sombreador de pixels, não o canal alfa do destino de renderização. No entanto, esse modo funciona apenas com um destino de renderização no hardware atual.
Até onde sei, as únicas opções para combinar vários destinos de renderização com o mesmo alfa são:
- Produza o mesmo alfa em todos os destinos de renderização (sacrificando a capacidade de armazenar outros valores no canal alfa como faria no sombreamento adiado, por exemplo).
- Repita a renderização em uma passagem separada para cada destino de renderização, usando a mistura de duas fontes.
- Use UAVs / armazenamento de imagem para executar a mistura no sombreador de pixels (só funciona se a geometria não se sobrepuser no espaço da tela, porque não há proteção contra as condições da corrida; provavelmente é meio lento).
- No hardware compatível, visualizações de ordem de varredura DX11.3 / DX12 , NV_fragment_shader_interlock ou INTEL_fragment_shader_ordering (o último também exposto pelas GPUs AMD). Estes são três nomes para a mesma coisa: basicamente, uma "seção crítica" no pixel shader que permite ler, modificar e escrever uma textura atomicamente em relação a outras invocações de pixel shader. Ele essencialmente permite a mistura programável arbitrária, mas provavelmente é bastante lenta e disponível apenas em hardware recente.