Soluções Z-fighting em teste de profundidade no OpenGL - como elas funcionam?
Descrição
Eu tive grandes problemas com o Z-Fighting no OpenGL e passei bastante tempo encontrando soluções para esse problema. Alguns dos que encontrei, compreendo e não gostei:
Afastando polígonos um do outro (como glPolygonOffset no OpenGL)Dividindo a cena de acordo com a coordenada Z e desenhando partes da cena com buffers z limpos separados.Os que eu não entendo:
Usando a matriz de projeçãohttps://software.intel.com/en-us/articles/alternatives-to-using-z-bias-to-fix-z-fighting-issuesUsando "Buffers de profundidade logarítmicos"http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.htmlEu implementei o segundo no meu programa apenas colocando isso no vértice shader de uma bola (ela z-lutou com o chão):
float C = 1.0;
float far = 2000.0;
gl_Position = u_projView * a_position;
gl_Position.z = 2.0*log(gl_Position.w*C + 1.0)/log(far*C + 1.0) - 1.0;
gl_Position.z *= gl_Position.w;
e funcionou!
Perguntas reaisAlguém pode me explicar, como a alteração da coordenada Z do vértice no sombreador de vértices resolveu o problema SEM mover o vértice visivelmente para mim? (a cena parece igual ao olho humano). Como isso mudou a distribuição dos valores de profundidade z? Acho que estou perdendo algum conhecimento sobre o pipeline de renderização.Alguém pode me explicar como podemos usarMatriz de projeção para consertar o problema ? E como isso funciona?Existem outras maneiras igualmente eficazes para corrigir o problema do z-fighting?Obrigado!