É possível misturar alfa vários destinos de renderização usando um alfa especificado?


9

Digamos que eu tenha renderizado os alvos 0 a N e o RT 0 tenha no seu quarto componente um canal alfa especificado por um material ou máscara ou algo assim.

É possível fazer com que o compositor de hardware combine os destinos de 1 a N usando o alfa do primeiro destino de renderização?

Respostas:


5

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.

Sim, acho que essa também foi minha conclusão. Você sabe de antemão se esse é o caso do DX12 ou do Vulkan (não lançado)? Ele tem aplicativos muito grandes para renderização adiada, como você mencionou, e nenhuma das alternativas existentes no momento parece satisfatória.
jeremyong

@jeremyong Desculpe, não acho que haja alterações nas operações de mistura no DX12. Não tenho certeza sobre Vulkan, mas ficaria surpreso; o hardware de mistura não mudou. FWIW, nos jogos em que trabalhei, fizemos uma variante do item 3 para decalques diferidos e pré-processamos a geometria para separá-la em grupos não sobrepostos.
Re

Gotcha obrigado pela recomendação. Decalques diferidos é precisamente o que eu estou implementando
jeremyong
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.