Eu realmente não consigo descobrir o que faz uma superfície se sobrepor a outra. Em um mecanismo 3D que estou criando, minha técnica está falhando em casos extremos.
Meu método é classificar as superfícies a serem pintadas da mais distante para a mais próxima. Para determinar a proximidade, estou comparando os valores médios de z. Às vezes, no entanto, uma superfície sobreposta tem um valor z médio mais alto do que aquele sobreposto. Assim, a superfície mais distante é pintada sobre a mais próxima - resultando em renderizações bizarras como esta:
O que se pretende ver é apenas a superfície frontal roxa do cubo, enquanto a superfície lateral vermelha é pintada sobre a roxa. O valor médio de z da superfície roxa é mais alto e, portanto, 'mais distante'. Então, eu estou tendo alguma dúvida se esta técnica está correta.
O que eu também tentei é distanciar a câmera (ou seja, a origem) da superfície, mas então precisava de um ponto. Eu escolhi o meio de cada superfície, mas isso nem sempre parece funcionar porque nem todas as superfícies são tão grandes quanto as outras.
Portanto, qual é uma maneira confiável de determinar a ordem de proximidade das superfícies em relação à origem?
O que você tem é um problema de visibilidade . Uma solução está usando um buffer z .
fonte
Classificar as faces de acordo com o valor z médio não funciona, porque o valor z médio não fornece informações sobre o valor z real dos vértices ou mesmo dos pixels da superfície.
Exemplo (aviso, arte ASCII adiante):
Existem duas faces A e B. Na perspectiva da câmera, A está na frente de B. No entanto, o valor z médio de B é menor. Vejamos os outros valores z:
Você pode tentar classificá-los pelos valores z mínimos, mas há casos em que isso também não funciona. Não há como classificar faces arbitrárias corretamente usando apenas um valor z.
No algoritmo de Newell http://en.wikipedia.org/wiki/Newell 's_algorithm, o que você faz é classificar os intervalos mínimo / máximo dos valores-z. Se os intervalos de duas faces não se sobrepuserem, você pode saber com certeza qual deles está na frente. Se o fizerem, às vezes é absolutamente necessário dividir os rostos. Às vezes, basta rastrear todos os vértices para oclusão ou alguma outra técnica.
fonte
É bom que você esteja aprendendo sobre renderização fazendo. Parabéns. Nesse caso, não existe uma solução de "algoritmo de pintores", em vez de tentar corrigi-lo por classificação, no PS1, costumávamos tentar manter os polígonos do mesmo tamanho quando estavam próximos um do outro (o que você está fazendo como até onde eu sei) e abate da face posterior (o que você não está fazendo)
A seleção da face posterior está verificando a superfície normal no espaço da tela em relação à sua direção (basta obter o sinal do elemento de profundidade no espaço da tela transformado normal (no nosso caso, era o z do normal) ou o produto cruzado de dois vetores do triângulo, ou seja, cruz (v1-v0, v2-v0))
Se você implementa a seleção de backface, também reduz a quantidade de rasterização que está fazendo .. dupla vitória.
fonte