- Em que situação dois objetos podem ter a mesma profundidade no Z-buffer?
Passo 1
O enunciado pergunta sobre o Z-buffer, que é o mecanismo que armazena, para cada pixel da tela, a profundidade (o valor de
após transformação para janela) do fragmento já desenhado. A ideia é impedir que um fragmento mais distante sobrescreva um fragmento mais próximo. Para resolver, vamos revisar quando dois fragmentos diferentes podem gerar exatamente o mesmo valor de profundidade no Z-buffer.
Passo 2
Quando processamos um fragmento, ele tem um valor de profundidade
já convertido para o intervalo de
(pós divisão por
e mapeamento para janela). Se dois fragmentos distintos chegarem a disputar o mesmo pixel e produzirem exatamente o mesmo valor de
— isto é,
com precisão de ponto flutuante do Z-buffer — eles aparecem como “empate” no teste de profundidade.
Passo 3
Uma situação típica em que isso ocorre é quando duas superfícies estão exatamente no mesmo plano no espaço do mundo, paralelas à câmera ou inclinadas, mas posicionadas de modo que, após toda a transformação (mundo
visão
projeção
janela), seus valores de profundidade coincidam. Em outras palavras, são polígonos coplanares ou cópias exatas um sobre o outro.
Passo 4
Outra causa comum é imprecisão numérica do Z-buffer. Mesmo que as superfícies não estejam rigorosamente na mesma profundidade, se a diferença for menor que a resolução do buffer (por exemplo, dois
que diferem em
num buffer de
bits), o hardware pode quantizá-los para o mesmo valor inteiro de profundidade.
Quando isso acontece, dizemos que ocorre “z-fighting”: os dois objetos brigam pelo mesmo pixel e o resultado varia frame a frame ou conforme o ângulo de visão, gerando flicker ou manchas indesejadas.
Quando isso acontece, dizemos que ocorre “z-fighting”: os dois objetos brigam pelo mesmo pixel e o resultado varia frame a frame ou conforme o ângulo de visão, gerando flicker ou manchas indesejadas.
Resposta
Dois objetos podem ter a mesma profundidade no Z-buffer quando seus fragmentos geram idêntico valor de profundidade após a transformação de viewport (por exemplo, superfícies perfeitamente coplanares ou cópias exatas uma sobre a outra) ou por causa de quantização/imprecisão do buffer, levando ao chamado z-fighting.