2011-01-22 15 views
7

Estoy desarrollando un juego para iPhone. Tengo la siguiente imagen de origen para dibujarla en segundo plano. La imagen de origen tiene alfa 0x00 y gradación alrededor del borde y el alfa del fondo es 0xff. Cuando dibujo la imagen de origen con el fondo, tengo el color negro como si pudiera ver la imagen de Resultado. Estoy utilizando el método OpenGL ES glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). He cambiado todos los argumentos posibles, pero cada vez que no se mueve.iPhone opengl es alpha-blending. Tengo color negro en el borde

¿Por qué tengo el color negro en el borde de la imagen de origen? ¿Cuál es el problema? ¿No todos los juegos en el iPhone usan gradación?

¿Debo hacer la imagen de origen sin gradación?

¿Alguien conoce la solución? imagen

Fuente:

alt text

imagen Resultado:

alfa

alt text

Respuesta

14

¿Su imagen tienen pre-multiplicado? A continuación, usted debe utilizar

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

Here es algunas explicaciones de lo que es.

Nota: Reescribí la respuesta después de investigar un poco. El artículo rotoglup mencionado tiene alguna información sobre lo que está pasando y tiene más sentido que mi fórmula original. También traté de ver lo que otras personas están usando en su código y parece que esta fórmula es la más utilizada. Es sorprendente cómo una cosa tan básica en los gráficos 3D como la mezcla alfa puede ser tan controvertida y todos parecen reinventar la rueda y encontrar sus propias soluciones.

+0

De acuerdo, esto parece una típica multiplicación doble de alfa. – v01d

+0

¿No debería ser ONE, ONE_MINUS_SRC_ALPHA? – rotoglup

+1

Aquí hay un artículo que puede ser otra fuente de explicaciones: http://home.comcast.net/~tom_forsyth/blog.wiki.html#%5B%5BPremultiplied%20alpha%5D%5D – rotoglup

0

Simplemente compruebe que la vista en la que está dibujando es opaca o no. establecer propiedad opaca en falso

+0

Esto está en OpenGL, no en UIKit. – v01d

0

Una manera en que esto puede ocurrir es si no ha configurado correctamente su glTexParameteri para la minificación y los filtros de ampliación correctamente, junto con su método de fijación. Ver el comentario here de Adam Redwood. Observe los problemas de texturas de poder de dos, límites de textura, etc. también pueden entrar en juego.

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
Cuestiones relacionadas