iPhone OpenGL ES: Aplicando um teste de profundidade em texturas que têm pixels transparentes para o jogo 2D

StackOverflow https://stackoverflow.com/questions/1320399

Pergunta

Atualmente, eu misturar e profundidade testar ligar para um jogo 2D. Quando eu tirar minhas texturas, o "superior" textura remover alguma parte das texturas mais baixas se eles se cruzam. Claramente, os pixels transparentes das texturas são levados em conta no teste de profundidade, e limpar todas as cores das texturas mais baixos desenhados se cruzam. Além disso, alfa blendings são processados ??de forma incorrecta. Há algum tipo de funções que podem dizer OpenGL para não incluir pixels transparentes em testes de profundidade?

Foi útil?

Solução

Não, não é possível. Isto é verdade para todos os testes de profundidade hardware.

GL (inteiro ou ES - e D3D), todos têm o mesmo modelo - eles pintam na ordem que você especificar polígonos. Se você desenhar polígono A antes polígono B, e logicamente polígono A deve estar na frente no polígono B, polígono B não será pintado (cortesia do teste de profundidade).

A solução é chamar-lhe polígonos, a fim de mais distante a mais próxima da origem vista atual. Felizmente, em um jogo 2D este deve ser apenas um tipo simples (que você provavelmente não vai mesmo precisar de fazer muito frequentemente).

BSPs jogos em 3D são a solução básica para esta questão.

Outras dicas

glEnable( GL_ALPHA_TEST );
glAlphaFunc( GL_EQUAL, 1.0f );

Isto irá descartar todos os pixels com um alfa de outra coisa senão totalmente opaco. Estes pixels irá, então, não ser processado para o Z-Buffer. Isso, no entanto, afetar várias otimizações de dutos Z-buffer por isso pode causar alguma lentidão graves. usá-lo somente se você realmente tem também.

Se você estiver usando shaders, pode tentar desativar mistura e descartar os pixels com alpha 0

if(texColor.w == 0.0)
    discard;

Que tipo de mistura que você está usando?

glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Deve evitar quaisquer fragmentos com alfa de 0 a partir de escrita para a memória intermédia de profundidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top