Sto scrivendo un gioco per iPhone in OpenGL ES, e sto vivendo un problema con alpha blending:OpenGL ES (iPhone) alpha blending sembra strano
sto usando glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA)
per ottenere alpha blending e cercando per comporre una scena con diversi "livelli" in modo da poterli spostare separatamente invece di avere un'immagine statica. Ho creato un'anteprima in Photoshop e poi ho cercato di ottenere lo stesso risultato nell'iPhone, ma viene visualizzato un alone nero quando mischio una texture con regioni semitrasparenti.
Ho allegato un'immagine. A sinistra c'è lo screenshot dell'iPhone, e nella parte destra è ciò che appare quando compongo la composizione in Photoshop. L'immagine è composta da un gradiente e un'immagine di sabbia con bordi sfumati.
È questo il comportamento previsto? C'è un modo per evitare i confini scuri?
Grazie.
MODIFICA: Sto caricando la parte del png contenente la sabbia. Il png completo è 512x512 e ha anche altre immagini.
Sto caricando l'immagine utilizzando il seguente codice:
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];
Ho caricato l'immagine di origine originale. Lo sfondo è una forma. Perché dici che con la modalità di fusione ho ottenuto miscele afose tra gli strati? – Damian
dopo aver visto le immagini originali, non stai facendo quello che pensavo stavi facendo. Quello che penso sia il problema è che l'API sta premoltiplicando l'alfa. È possibile ovviare rapidamente a questo problema utilizzando la modalità di fusione glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA). Capisco che sia uno dei fastidi dell'iPhone. – Montdidier
L'utilizzo di glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) non consente di modificare l'alfa globale dell'immagine utilizzando glColor. – Damian