Ao renderizar duas superfícies co-planares sobrepostas, um problema comum é "z-fighting", onde o renderizador não pode decidir qual das duas superfícies está mais próxima da câmera, fornecendo artefatos visuais na área de sobreposição.
A solução padrão para isso é dar às superfícies um pequeno deslocamento ao projetar o modelo. existe alguma outra solução?
Respostas:
Se as superfícies são exatamente co-aplainadoras, seu destino depende dos deuses da FPU; você provavelmente terá Z-fighting. Se os triângulos são idênticos e você fazer o exato mesma matemática para cada um, você vai acabar com o mesmo Z-valores para ambos. Mas, novamente, isso só acontecerá se suas operações matemáticas forem idênticas para ambos. (Como, geralmente, as operações da FPU não são comutativas)
Uma solução possível é não usar o buffer Z. Em vez disso, você pode usar o algoritmo do pintor . É verdade que isso também vem com todos os problemas do algoritmo dos pintores. Mas isso resolveria o Z-fighting.
No seu exemplo de exemplo de decalques de espaço de tela (SSDs), a solução comum é usar um deslocamento, também conhecido como cubo fino simples. Veja a apresentação do Warhammer 40k sobre SSDs para referência. Ou o post de Bart Wronski, que aborda alguns outros problemas com decalques, mas também inclui algumas outras apresentações sobre SSDs
fonte
Aqui está como eu resolvi isso no passado:
Observe que os objetos precisam ser desenhados consecutivamente para que isso funcione.
fonte
Dependendo do seu renderizador, você pode tornar as superfícies mais "nebulosas", aplicando um deslocamento minúsculo na profundidade de várias amostras usando um algoritmo semelhante ao ruído. Isso deve resultar em um tipo de efeito de mesclagem para superfícies muito próximas. Pelo que sei, a configuração da profundidade por amostra no shader de fragmento é bastante recente no OpenGL e depois apenas como uma extensão.
O OpenGL possui o PolygonOffset, mas requer saber com antecedência que você está prestes a renderizar algo coplanar. Embora não seja viável para superfícies em um único modelo, poderia funcionar bem, por exemplo, ao renderizar uma estrada sobreposta em um pedaço de terra.
fonte