Ordenar transparencia independiente en el sistema de partículas

9

Estoy escribiendo un sistema de partículas y me gustaría encontrar un truco para lograr una combinación alfa adecuada sin clasificar las partículas porque:

  • Cada partícula es un sprite puntual en una sola malla y no puedo usar la capacidad del gráfico de escena para ordenar nodos transparentes. Sin embargo, el nodo del sistema debe estar ordenado correctamente.
  • La posición de la partícula se calcula en el sombreador a partir de la velocidad inicial, la aceleración y el tiempo. Para ordenar el sistema, tendría que realizar todos estos cálculos en la CPU, que es algo que quiero evitar.
  • Clasificar cientos de partículas contra la posición de la cámara y cargarlas en la GPU cada costura del cuadro para que sea una operación silenciosa y pesada.

Las pruebas alfa parecen ser lo suficientemente rápidas en GLES 2.0 y funcionan bien para texturas no transparentes pero "enmascaradas". Aún así, no es suficiente para partículas semitransparentes.

¿Cómo manejarías esto?

Stepan Zastupov
fuente
Absolutamente, ¿cuán esencial es que estén correctamente ordenados? ¿Has visto algún artefacto (importante) usando la mezcla de vainilla?
ChrisE
Una partícula puede mezclarse con el fondo en lugar de otra partícula y luego la esencia "rectángulo" del punto-sprite es muy notable. Las pruebas alfa ayudan aquí, pero los artefactos siguen siendo notables cuando el valor alfa es bajo pero no lo suficiente como para descartar el fragmento.
Stepan Zastupov
66
¿Ha intentado deshabilitar las escrituras de profundidad (dejando las pruebas de profundidad activadas) al renderizar las partículas? Eso debería hacer que el pedido incorrecto sea menos obvio.
Adam
2
Después de algunos experimentos, descubrí que deshabilitar la escritura en profundidad es la mejor solución en la mayoría de los casos.
Stepan Zastupov

Respuestas:

10

Esto es lo que haría.

Paso 1: no ordenar. Simplemente hazlo. A ver si es un problema. Lo más probable es que no lo sea.

Paso 2: limite las partículas de tal manera que realmente no necesiten clasificación, tales como:

  • Solo sólidos (posiblemente con bordes de alfa a cobertura)

    • Deje que zbuffer se encargue de la clasificación.
  • Solo bits aditivos

    • a + b = b + a, entonces el orden no importa

Paso 3: si se necesita más, divida el renderizado de partículas en bits que deben estar al frente y el resto, y realice el renderizado en varias pasadas (por ejemplo, podría solucionar el humo complejo)

Paso 4: si aún se necesita más, o si necesita una solución general, una cosa que viene a la mente sería usar MRT para obtener una clasificación de cubos de N muy aproximada; renderice las partículas en N superficies de salida y compóngalas en un paso separado.

Cualquier otra cosa requeriría más información sobre su caso de uso específico. Pero estoy bastante seguro de que, después de todo, realmente no necesita la independencia del orden. Simplemente use suficientes partículas al azar y estará bien =)

Jari Komppa
fuente
6

Simplemente no escriba en el búfer de profundidad cuando renderice las partículas. Esto les permitirá a todos ser procesados ​​y mezclados entre sí. Sin embargo, aún debe realizar pruebas de profundidad para que puedan ser ocluidas adecuadamente por la geometría en la escena.

KlashnikovKid
fuente
5

El uso del orden de mezcla aditiva no importa:

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

Esto supone que la textura de tu sprite tiene un fondo transparente.

teh_leecherer
fuente