Я пишу игру для IPhone в OpenGL ES, и я испытываю проблемы с альфа-смешивания:OpenGL ES (IPhone) альфа-смешивание выглядит странно
Я использую glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA)
достичь альфа-смешивание и пытается для создания сцены с несколькими «слоями», чтобы я мог перемещать их отдельно, вместо статического изображения. Я создал предварительный просмотр в фотошопе, а затем попытался добиться того же результата в iphone, но черный ореол отображается, когда я смешиваю текстуру с полупрозрачными областями.
Прикрепленный файл. В левой части экрана находится скриншот из iphone, а справа - это то, на что похоже, когда я делаю композицию в Photoshop. Изображение составлено градиентом и песочным изображением с пернатыми краями.
Ожидаемое поведение? Есть ли способ избежать темных границ?
Спасибо.
EDIT: Я загружаю часть png, содержащую песок. Полный png - 512x512 и имеет другие изображения.
я загружаю изображение, используя следующий код:
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];
Я загрузил исходное исходное изображение. Фон - это форма. Почему вы говорите, что в режиме смешивания я собираюсь получить грязные смеси между слоями? – Damian
, увидев исходные исходные изображения, вы не делаете то, что, как я думал, вы делали. Я считаю, что проблема заключается в том, что API премультипирует альфу. Вы можете быстро обойти это, используя вместо этого blend mode glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA). Я понимаю, что это одна из неприятностей API iphone. – Montdidier
Использование glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) не позволит мне изменить общую альфу изображения с помощью glColor. – Damian