iPhone OpenGL ES: La aplicación de una prueba a fondo sobre las texturas que tienen píxeles transparentes para el juego en 2D

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

Pregunta

Actualmente, tengo la mezcla y pruebas de profundidad se encienden durante un juego en 2D. Cuando dibujo mis texturas, la textura "superior" eliminar alguna porción de las texturas más bajos si se intersecan. Claramente, los píxeles transparentes de las texturas se tienen en cuenta la prueba de profundidad, y una limpieza de los colores de las texturas dibujadas inferiores si se intersecan. Por otra parte, blendings alfa se representan de forma incorrecta. ¿Hay algún tipo de funciones que puede decir OpenGL para que no incluya los píxeles transparentes en las pruebas de profundidad?

¿Fue útil?

Solución

No, no es posible. Esto es cierto para todas las pruebas de la profundidad de hardware.

GL (completo o es - y D3D) todos tienen el mismo modelo - que pintan en el orden que especifique polígonos. Si dibuja polígonos Un polígono antes de B, y lógicamente polígono A debe estar al frente de polígono B, polígono B no será pintado (cortesía de la prueba de profundidad).

La solución es dibujar polígonos que con el fin de más lejana a más cercana al origen vista actual. Felizmente en un juego 2D esto sólo debería ser una especie sencilla (una es probable que ni siquiera tendrá que hacer muy a menudo).

En 3D juegos BSP son la solución básica a este problema.

Otros consejos

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

Esto descartará todos los píxeles con un alfa de otra cosa que no sea completamente opaco. Estos píxeles, entonces, no ser prestados a la Z-Buffer. Esto, sin embargo, afecta a varias optimizaciones de tuberías Z-Buffer por lo que puede causar algunos retrasos graves. Sólo se debe usar si realmente tener también.

Si estás usando shaders, puede intentar deshabilitar la mezcla y deseche los píxeles con alfa 0

if(texColor.w == 0.0)
    discard;

¿Qué tipo de mezcla está usando?

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

debe impedir a ningún fragmentos con alfa de 0 de la escritura a la memoria intermedia de profundidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top