Las imágenes transparentes de OpenGL tienen negro en ellas

Estoy trabajando en un juego para Android y me preguntaba por qué cada vez que dibujo imágenes con transparencia parece que siempre haya algo de negro añadido a las partes transparentes. Esto sucede por todas partes y hace que algunos de mis efectos parezcan extraños.

Aquí hay un ejemplo. Los dos círculos son sólo imágenes blancas con un desenfoque, pero se puede ver cuando uno se superpone al otro tiene una sombra. Si me superpongo dos de los círculos dicen en Inkscape obtener blanco puro donde se superponen.

Introduzca aquí la descripción de la imagen

estoy usando

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

Para mi mezcla.

¿Alguna idea de por qué sucede esto y cómo puedo evitarlo?

Editar: lo único que se me ocurre es que las dos imágenes tienen el mismo z, así que tal vez se mezclan sólo con el fondo en lugar de uno al otro?

Editar: He cambiado

 GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

a

 GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_DST_ALPHA); 

Aquí está el resultado que buscaba.

Introduzca aquí la descripción de la imagen

La única cosa ahora es que las imágenes transparentes que tuve que tienen un negro transparente en ellas son ignoradas, lo cual tiene sentido porque creo que el destino alfa es 1. ¿Por qué una fuente menos agregaría ese gris?

4 Solutions collect form web for “Las imágenes transparentes de OpenGL tienen negro en ellas”

Me di cuenta de cómo arreglarlo.

Cambié

 GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

a

 GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

Resulta que Android pre-multiplica el alfa de las texturas de las imágenes PNG cuando se carga (hacer blanco gire gris).

yo añadí

 vColor.r = vColor.r * vColor.a; vColor.g = vColor.g * vColor.a; vColor.b = vColor.b * vColor.a; 

A mi vertex shader para hacer la multiplicación de mis otros colores.

¿Estás seguro de que tu contenido es correcto? Si no desea que los círculos produzcan ningún color negro, los valores de color de la imagen deben ser completamente blancos y el canal alfa debe definir la forma del círculo. Ahora parece que la imagen tiene un círculo blanco con el canal alfa y el valor del color se desvanece a cero, lo que lleva a un halo.

¿Está usando el muestreo lineal? Mi pensamiento podría ser si usted tiene una imagen muy pequeña (menos de decir 30-40 píxeles en la dimensión), podría estar recibiendo valores interpolados de alfa entre el interior del círculo (alfa = 1) al exterior del círculo (alfa = 0). Esto le daría valores alpha intermedios que resultan en el tipo de efecto borroso.

Pruebe el siguiente código cuando tenga la textura de círculo vinculada:

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

Tal vez usted puede alojar la textura real que está utilizando de tal manera que se puede inspeccionar? También ponga por favor su código del dibujo si esto no ayuda.

También puede dividir por alfa, porque, el problema es que, al exportar sus texturas, el software de procesamiento de imágenes puede pre-multiplicar su canal Alpha. Terminé con la división alfa en mi shader de fragmentos. El siguiente código es HLSL, pero puede convertirlo fácilmente a GLSL:

 float4 main(float4 tc: TEXCOORD0): COLOR0 { float4 ts = tex2D(Tex0,tc); //Divide out this pre-multiplied alpha float3 outColor = ts.rgb / ts.a; return float4(outColor, ts.a); } 

Tenga en cuenta que esta operación es con pérdidas, muy con pérdidas e incluso si lo más probable es que sea suficiente en casos como estos, no es una solución general. En su caso puede ignorar totalmente el COLOR y servir alfa y blanco originales en su fragmento shader, por ejemplo return float4(1,1,1,ts.a); (Convertir a GLSL)

  • Android: Si los marcadores se superponen entre sí en el mapa, el evento de clic se disparará para el último escondido
  • Mi mapa no muestra el mapa sólo muestra los elementos de superposición
  • Superposición sobre la barra de navegación en Android 4
  • Implementación de un mapa interior
  • La importación com.android.internal.R no se puede resolver
  • Comportamiento extraño de superposición al ampliar el MapView
  • Dibujar texto en la parte superior de mapa de bits no
  • ¿Cómo capturar eventos onTouch en dos vistas superpuestas?
  • Cómo obtener fechas de la base de datos y comprobar si se solapan?
  • Mostrar una superposición de "ayuda" en un diseño de Android
  • Convertir la ubicación en GeoPoint
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.