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.html

Eu 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!

questionAnswers(1)

yourAnswerToTheQuestion