Decalques diferidos problema normal

11

Eu tenho trabalhado em um sistema de decalque diferido. Até agora, terminei a parte da projeção, o que significa que posso clicar em algo na cena e ele projetará adequadamente um decalque na superfície do objeto.

Há algumas outras coisas que gostaria de adicionar a este sistema: recorte normal e decalques mapeados normais. O recorte normal é quando descartar fragmentos esticados em um ângulo agudo. Visto aqui . Uma maneira de resolver isso é descartar fragmentos que tenham uma grande diferença entre o normal no G-Buffer e o normal do decalque. Isso exigiria a leitura da textura normal do buffer G.

Para fazer o mapeamento normal do decalque, preciso misturar o normal do decalque (de um mapa normal) com o normal do buffer G. Isso requer a gravação na textura normal do buffer G.

Espero que fique claro que, para oferecer suporte a esses dois recursos, preciso ler e escrever na textura normal na mesma passagem de sombreador. Infelizmente, esse é um comportamento indefinido, por isso estou me perguntando se existe alguma outra maneira de implementar esses recursos.

Ian
fonte

Respostas:

1

Qual sistema de renderização você usa? As informações a seguir devem ser válidas para todos os sistemas de renderização, mas nas versões OpenGL do DX11 ou posterior, pode haver uma solução melhor usando os UAVs.

-

Você precisará copiar o buffer normal antes de cada passagem. Desde que você saiba que os decalques não modificam os mesmos fragmentos de espaço na tela, não é necessário atualizar a cópia.

Você também pode renderizar todos os seus decalques em buffers separados e apenas uma mistura passa para o buffer normal usando uma única cópia normal do buffer. Isso aumentaria muito melhor com a quantidade de adesivos que você possui.

Desde que você não grave o buffer normal, por exemplo, execute apenas o corte normal, como você o chama, você pode apenas experimentar o buffer normal original, mas não pode vinculá-lo como um destino de renderização.

No DX9, descobri que ler e escrever na mesma textura resulta na saída esperada, desde que você use apenas a filtragem de ponto mais próxima e nunca leia um pixel diferente do que você escreve atualmente, MAS! Como esse é um comportamento indefinido, pode haver drivers e placas gráficas que não se comportam dessa maneira. O DX10 impedirá que você faça isso, desvinculando as texturas atualmente vinculadas como destinos de renderização.

Archy
fonte