2010-05-22 10 views
5

estoy tratando de mezclar texturas que tienen áreas transparentes:mezcla de texturas transparentes con profundidad

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, ...); 
glVertexPointer(2, GL_FLOAT, 0, ...); 
glEnable (GL_BLEND); 
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

A menos que agrego glDisable (GL_DEPTH_TEST), partes transparentes de los mejores texturas sobreescriben todo debajo de ellos (en lugar de la mezcla). ¿Hay alguna forma de hacer esto sin deshabilitar la profundidad? He intentado varias funciones de fusión, pero ninguna ayudó.

Respuesta

7

La habilitación de la prueba de profundidad en realidad no ordena su geometría por profundidad; en el caso habitual GL_LESS, simplemente impide que las primitivas dibujen si no están más cerca del visor que lo que se dibujó previamente. Esto le permite dibujar una geometría opaca en el orden que desee y aún así obtener el resultado deseado, pero la representación correcta de la geometría combinada generalmente requiere que todo lo que se encuentra detrás del objeto mezclado ya haya sido renderizado.

Esto es lo que debe hacer para obtener una mezcla de geometría opaca y se mezclan para mirar a la derecha:

  1. independiente de su geometría mezclado de su geometría opaco.
  2. Clasifique su geometría combinada de atrás hacia adelante.
  3. Primero dibuje toda la geometría opaca como de costumbre.
  4. Dibuje su geometría combinada en orden ordenado. Deberá dejar activada la prueba de profundidad pero deshabilitar temporalmente las escrituras de profundidad con glDepthMask(GL_FALSE).

Como alternativa, si su contenido es siempre totalmente opaco o totalmente transparente, puede habilitar las pruebas alfa y desactivar la fusión, pero supongo que eso no es lo que está buscando.

Cuestiones relacionadas