La combinación alfa se puede activar para hacer que las superficies sean transparentes, así:
glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Pero esto solo funciona si los objetos se representan en orden de atrás hacia adelante. De lo contrario, las cosas en el fondo aparecen frente a objetos más cercanos, como el piso en la imagen a continuación. Para las partículas y los elementos de la GUI, la ordenación estaría bien, pero para las mallas triangulares parece que sería demasiado esfuerzo y lento, como se explica aquí: https://www.opengl.org/wiki/Transparency_Sorting .
¿Cuáles son los métodos comunes para lidiar con esto? Sé que esto es bastante amplio y no busco detalles de implementación en profundidad, solo una breve descripción de algunos enfoques y lo que podría estar involucrado.
opengl
rendering
transparency
jozxyqk
fuente
fuente
Respuestas:
Un conjunto de técnicas para evitar pedidos explícitos se denominan Orden de Transparencia Independiente (OIT para abreviar).
Hay muchas técnicas de la OIT.
Históricamente uno es el peeling de profundidad . En este enfoque, primero se representan los fragmentos / píxeles más frontales, luego se encuentra el más cercano al que se encontró en el paso anterior y así sucesivamente, pasando con tantas "capas" como sea necesario. Se llama pelado de profundidad porque en cada pasada se "pela" una capa de profundidad. Toda su capa se puede recombinar normalmente de atrás hacia adelante. Para implementar este algoritmo, debe tener una copia del búfer de profundidad.
Otro conjunto de técnicas son las combinadas de la OIT. Una de las más recientes e interesantes es la OIT Blended ponderada propuesta por McGuire y Bavoil . Básicamente aplica una suma ponderada para todas las superficies que ocupan un fragmento dado. El esquema de ponderación que proponen se basa en el espacio de cámara Z (como una aproximación a la oclusión) y la opacidad.
La idea es que si puede reducir el problema a una suma ponderada, realmente no le importa ordenar.
Además del documento original, un gran recurso para detalles de implementación y problemas de Weighted Blended OIT está en el blog de Matt Pettineo . Como puede leer en su publicación, esta técnica no es una bala de plata. El principal problema es que el esquema de ponderación es central y debe ajustarse de acuerdo con su escena / contenido. A partir de sus experimentos, aunque la técnica parece funcionar bien para una opacidad relativamente baja y media, falla cuando la opacidad se acerca a 1 y, por lo tanto, no se puede utilizar a partir de materiales donde gran parte de la superficie es opaca (hace el ejemplo del follaje).
Una vez más, todo se reduce a cómo ajustar sus pesos de profundidad y encontrar los que se ajustan perfectamente a sus casos de uso no es necesariamente trivial.
En cuanto a lo que se necesita para la OIT mezclada ponderada, nada más que dos objetivos de procesamiento adicionales. Uno que llene con el color alfa premultiplicado (color * alfa) y alfa, ambos ponderados en consecuencia. El otro solo para las pesas.
fuente
Una opción es usar pelado en profundidad.
Esencialmente, uno procesa la escena varias veces (digamos,
n
veces) para determinar eln
fragmento más cercano, el segundo más cercano, hasta los fragmentos más cercanos de la escena.Este procesamiento se realiza aplicando primero una prueba de profundidad regular a toda la escena (que, naturalmente, devuelve la superficie más cercana). Luego se usa el resultado de la prueba de profundidad para filtrar la primera capa, ignorando todo con una profundidad menor que la que se obtiene en la prueba de profundidad.
Al volver a aplicar la prueba de profundidad, se devolverá la segunda capa. Repita según sea necesario.
Una vez que tenga las capas, puede dibujar todas las capas en orden inverso (suponiendo que realizó un seguimiento de los colores RGBA para cada capa), mezclando normalmente, ya que las capas están en orden de adelante hacia atrás.
fuente
La creme de la creme de un solo paso no (o pocos) compromete la transparencia en OpenGL es un búfer A. Con OpenGL moderno, es posible implementar:
http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html
Evita los múltiples pases de pelado en profundidad y no requiere una clasificación onerosa.
fuente