Implementação do decalque

11

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?

dreta
fonte
Aqui está um link com os links: gamedev.stackexchange.com/questions/24653/…
Luis Estrada

Respostas:

5

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.

knight666
fonte
eu vi esse artigo várias vezes, o fato é que ele não fala sobre o que estou perguntando, como você mencionou, o z fighting não é realmente uma questão de distância, é só que você 're tentando processar bem em cima da geometria existente e devido à precisão limitada, pode / não pode você ter certeza de que estará no topo ou exatamente no mesmo lugar
dreta
1
Ao desenhar decalques, você sempre pode definir a função de comparação do buffer de profundidade como menor que ou igual a menor que isso, pois os decalques são sempre desenhados exatamente na superfície que estão afetando.
Jmegaffin
1

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

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Espero que isso explique melhor .. (conforme solicitado)

Todo o quadro de arame.

Somente terreno de arame.

Mike O
fonte
1
Essa resposta parece particularmente curta e inespecífica. Você poderia esclarecer sua resposta?
Gnemlock
1
Não é difícil de entender. Movo o vértice apenas um pouco na direção Z no espaço da tela. Como no OpenGL você está sempre olhando em Z positivo no espaço da tela, mover o Z negativo uma pequena quantidade corrige a luta contra Z. No entanto, há um problema com isso. À medida que diminui o zoom, o z pode mover o decalque muito mais do que o necessário.
Mike O