Eu tenho um pipeline no Vulkan com colorBlendState
with blendEnable = false
, logicOpEnable = true
e logicOp = XOR
para que a saída do shader de fragmento seja XORed com o conteúdo atual do anexo de cor. Eu tenho isso funcionando e se comporta conforme o esperado... principalmente.
O problema é que quando triângulos sobrepostos são usados no buffer de fragmentos, os triângulos parecem sofrer XOR entre si, mesmo que estejam todos na mesma passagem de renderização. Depois de pesquisar um pouco, parece que esse pode ser o comportamento correto, mas não é o desejado para o meu caso. Existe alguma maneira de revisar minha passagem de pipeline/renderização para executar apenas a operação lógica entre a saída do sombreador de fragmento e o conteúdo do anexo de cor carregado, e não entre triângulos individuais do sombreador de fragmento?
Ou seja, quero que todos os triângulos definidos no buffer de vértices sejam desenhados sem mesclagem ou operação lógica, até que o resultado final seja gravado no anexo de cores. Existe alguma maneira de fazer isso sem adicionar uma segunda passagem de renderização ou subpassagem?
As operações lógicas não se aplicam entre triângulos. São operações relacionais entre um fragmento (talvez gerado a partir de um triângulo) e o que quer que esteja no framebuffer no momento. Qual "triângulo" gerou o valor do framebuffer não é relevante para a operação.
No entanto, você pode empregar outras operações para evitar sobreposição. Por exemplo, você pode usar testes de estêncil. Se você limpar os bits do estêncil para um valor conhecido, poderá fazer com que cada triângulo faça um teste para esse valor. As operações por fragmento só continuarão se o bit do estêncil for testado positivamente em relação ao valor no framebuffer. No entanto, o triângulo também escreverá um valor diferente no buffer de estêncil. Dessa forma, se dois triângulos se sobrepuserem, todos os fragmentos do último que estiverem em cima do anterior serão eliminados.
Isto inclui o resultado de quaisquer operações lógicas.
No entanto, você terá que ordenar os triângulos da frente para trás para que isso funcione.