Estoy escribiendo un juego para iPhone en OpenGL ES, y yo estoy experimentando un problema con mezcla alfa:OpenGL ES (iPhone) mezcla alfa ve raro
estoy usando glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA)
para lograr la mezcla alfa y tratando para componer una escena con varias "capas", así puedo moverlas por separado en lugar de tener una imagen estática. Creé una vista previa en photoshop y luego traté de lograr el mismo resultado en el iphone, pero se muestra un halo negro cuando combino una textura con regiones semitransparentes.
Adjunté una imagen. En la izquierda está la captura de pantalla del iphone, y en la derecha está lo que parece cuando hago la composición en photoshop. La imagen está compuesta por un degradado y una imagen de arena con bordes emplumados.
¿Es este el comportamiento esperado? ¿Hay alguna manera de evitar las fronteras oscuras?
Gracias.
EDIT: Estoy cargando la parte del png que contiene la arena. El png completo es de 512x512 y tiene otras imágenes también.
Estoy cargando la imagen utilizando el siguiente código:
NSString *path = [NSString stringWithUTF8String:filePath];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];
if (image == nil) NSLog(@"ERROR LOADING TEXTURE IMAGE");
GLuint width = CGImageGetWidth(image.CGImage);
GLuint height = CGImageGetHeight(image.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
void *imageData = malloc(height * width * 4);
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextClearRect(context, CGRectMake(0, 0, width, height));
CGContextTranslateCTM(context, 0, height - height);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
CGContextRelease(context);
free(imageData);
[image release];
[texData release];
He subido la imagen de la fuente original. El fondo es una forma. ¿Por qué dices eso con el modo de fusión que tengo Voy a obtener mezclas bochornosas entre las capas? – Damian
después de ver las imágenes fuente originales, no estás haciendo lo que pensé que estabas haciendo. Lo que creo que es el problema es que la API está premultiplicando el alfa. Puede solucionar esto rápidamente utilizando en su lugar el modo de combinación glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA). Entiendo que es una de las molestias de la API de iPhone. – Montdidier
Usar glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) no me permitirá cambiar el alfa general de la imagen con glColor. – Damian