2011-03-14 23 views
7

I tienen el siguiente proceso:OpenGLES mezclan partículas, pero no el fondo

- draw background 
- draw objects and blend with background (1)GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA 
- draw particle effect with blending (2)GL10.GL_SRC_ALPHA, GL10.GL_ONE in order to highlight overlapping particles 

Problema - cuando dibujo de partículas que se mezclan, además, con el fondo y se vuelve muy brillante.

Simplemente lo que necesito es mezclar partículas con (2) y todas juntas para mezclar con el fondo usando (1).

soluciones que no trabaja:

  • efecto de una textura de dibujo y de la aplicación funciona bien ... pero extremadamente lento.
  • Dibujo efecto de partículas y despues de fondo, que se vea bien ... pero no puedo dibujar objeto de escena que debido a que necesitan estar entre BG y efectuar

Aquí está la pantalla para mostrar la diferencia. En el resultado deseado, a la izquierda, las partículas se mezclan con el fondo.

img:

enter image description here

apreciaré cualquier ayuda ...

más reciente: yo era capaz de obtener el color que quiero ... pero ... (Parece que esto no me va a mover a ninguna parte) He renderizado el fondo con alpha = 0 y que uso la función blend de GL11Ext: glBlendFuncSeparate (GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA, GL10.GL_ONE, GL10.GL_ONE);

GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA - los colores se mezclan sólo si tienen alfa (BG no tiene ahora)

GL10.GL_ONE, GL10.GL_ONE - alfa se ajusta al máximo para todas las partículas escritas para simular aditivo de mezcla

enter image description here

funciona bien como se puede ver ... excepto la zona de llenado de color negro donde las partículas alfa imagen tiene 0..and cuál es malo que la imagen resultante en la que el color negro tiene alfa 1 por lo que no puede reemplazarlo de ninguna manera ...

EDIT_2 Problema general en palabras simples: Necesito dibujar un efecto rojo brillante (0xff0000) brillante (combinación aditiva). Sobre fondo negro, está bien, pero si tomara verde (0x00ff00), el color resultante sería cercano a 0xffff00

¿Alguna idea?

+0

¿Funcionaría el procesamiento en un búfer de cuadros por separado? ¿Tiene una mezcla aditiva de todas sus partículas en un búfer de cuadro transparente completo y luego hacer una mezcla alfa normal de ese búfer de cuadro en su escena principal. – TurqMage

+0

Sí, funciona. Pero muy lento, pierdo cerca de 20 fps solo cambiando el framebufferes – Yuriy

Respuesta

2

GL10.GL_SRC_ALPHA, GL10.GL_ONE a fin de destacar partículas superpuestas

No hay otra manera que el aditivo de mezcla para evitar la necesidad de clasificar partículas. Si todavía desea seguir con esto para evitar la superposición de las partículas, le sugiero que inyecte un control de sangrado en la representación para que pueda reducir la luminosidad de las partículas procesadas o puede reducir el brillo de la textura de la partícula.

+0

He tratado de reducir el brillo de la textura de la partícula, pero no está funcionando, la textura es principalmente con color rojo (cerca de 0xee) y poca cantidad de geen, azul. Durante la mezcla con bg, el rojo se incrementa solo un poco porque es casi máximo, pero el verde y el azul aumentan significativamente. Debido a que el color está roto. – Yuriy

+0

¿Podría explicar lo que quiere decir con "inyectar un control de purgado en la representación para que pueda reducir la luminosidad de las partículas procesadas" – Yuriy

+0

Supongo que está utilizando ES 1.0, allí puede hacer una simple multiplicación configurando glColor * en un valor deseado, se multiplica con el color que establece con el color de la textura que le da un control fino sobre los colores prestados. Así que estableciendo glColor4f (0.5,0.5,0.5,1.0); reducirá el brillo de las texturas a la mitad. –

1

Puede usar glAlphaFunc(GL_GREATER, 0) para rechazar los fragmentos alfa = 0 de las partículas. Recuerde primero glEnable(GL_ALPHA_TEST).

+0

? Buena idea Ryanm, ayuda a eliminar los píxeles negros ... pero todavía hay un problema. Hay muchos píxeles en los bordes del efecto que tienen un alfa muy bajo, pero no cero. Esos píxeles se deben mezclar con fondo como GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA. Si tuviera shaders, sería simple que ... pero aquí con solo 1.1 ... – Yuriy

0

¿Funcionaría el procesamiento en un búfer de cuadros por separado? ¿Tiene una mezcla aditiva de todas sus partículas en un búfer de cuadro transparente completo y luego hacer una mezcla alfa normal de ese cuadro

Cuestiones relacionadas