Tive problemas ao encontrar informações sobre decalques, talvez essa pergunta ajude outras pessoas. A implementação é para um renderizador de encaminhamento.
Alguém poderia confirmar se a implementação do decalque está correta?
- Você define um cubo de qualquer dimensão que definirá o volume da projeção no espaço comum. Você verifica a interseção do triângulo com o cubo definido para receber triângulos que a projeção afetará.
- Você corta esses triângulos e os salva.
- Em seguida, você usa truques de matriz para calcular coordenadas UV para os triângulos salvos que farão referência à textura que você está projetando.
- Para fazer isso, você pega os vetores que representam a altura, largura e profundidade do cubo no espaço comum, para que o canto inferior esquerdo seja a origem.
- Você coloca isso em uma matriz como os vetores unitários i, j, k, define a conversão para o cubo e depois inverte essa matriz.
- Você multiplica os vértices dos triângulos salvos por esta matriz, para obter as coordenadas deles dentro de um cubo de 0 a 1 tamanho que você usa como coordenadas UV.
- Dessa forma, você tem os triângulos originais nos quais está projetando e possui coordenadas UV para elas (as coordenadas UV referenciam a textura que você está projetando).
- Em seguida, você renderiza novamente os triângulos salvos na cena e eles substituem a área de projeção pela imagem projetada.
Agora, as perguntas para as quais não consegui encontrar respostas. O último ponto está certo? Eu nunca fiz o recorte de software, mas parece propenso a erros, devido à precisão limitada, que haverá alguma briga pela textura projetada. Também é a maneira de obter as coordenadas UV corretas?
Respostas:
Dê uma olhada neste artigo:
http://blog.wolfire.com/2009/06/how-to-project-decals/
Parece que ele está usando exatamente a mesma abordagem que você está usando. Ele não fala sobre z-fighting, mas definitivamente poderia se tornar um problema a distâncias maiores.
Minha sugestão seria desativar os decalques após uma certa distância, se o z-fighting se tornar muito visível.
fonte
O que fiz para resolver a luta contra o Z foi aumentar o valor de Z do vértice em uma pequena quantidade, no meu shader do decalque, depois que ele estiver nas coordenadas da tela.
OK ..... Eu uso decalques de malha. Eu crio uma malha nxn com Y sentado no terreno. Eu uso o código para encontrar o Y na malha poligonal do terreno. Depois de todas as transfroms, estou desenhando por cima da geometria existente nas coordenadas da tela. O buffer de profundidade está nas coordenadas da tela. Ao mover o Z dos polígonos dos decalques um pouco em direção à tela, ele interrompe o combate Z. Ao fazer isso, reduzi pela metade a quantidade de polígonos que compõem minhas malhas de adesivos. Este é o código 120 antigo
Espero que isso explique melhor .. (conforme solicitado)
fonte