Рендеринг изображения CoreGraphics из OpenGL имеет черный фон

Я не могу отобразить изображение из контекста OpenGL с прозрачным фоном в CoreGraphics.

Визуализированное изображение имеет черный фон.

это код розыгрыша

   GLint default_frame_buffer = 0;
   glGetIntegerv(GL_FRAMEBUFFER_BINDING, &default_frame_buffer);
   if (default_frame_buffer == 0) {
       target = createBMGLRenderTarget(width, height);
       setFiltering(target, BMGL_BilinearFiltering);
       glBindFramebuffer(GL_FRAMEBUFFER, target->framebuffer);
   }

   glViewport(0, 0, width, height);

   if (background) {
       CGFloat red, green, blue, alpha;
       [background getRed:&red green:&green blue:&blue alpha:&alpha];
       glClearColor(red, green, blue, alpha);
   } else {
       glClearColor(0.f, 0.f, 0.f, 0.f);
   }
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

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

   drawer.draw()

   glFlush();
   glFinish();

   GLubyte *data = (GLubyte *)malloc(width * height * 4);
   glPixelStorei(GL_PACK_ALIGNMENT, 4);
   glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);

   CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, width * height * 4, NULL);
   CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
   CGImageRef imgRef = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, ref, NULL, NO, kCGRenderingIntentDefault);

   UIGraphicsBeginImageContextWithOptions(size, YES, 0.0);
   CGContextRef cgContext = UIGraphicsGetCurrentContext();
   CGContextSetBlendMode(cgContext, kCGBlendModeCopy);
   CGContextDrawImage(cgContext, CGRectMake(0, 0, size.width, size.height), imgRef);
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext(); 
   free(data);
   CGDataProviderRelease(ref);
   CGColorSpaceRelease(colorspace);
   CGImageRelease(imgRef);

Я пытался специально установить непрозрачность в false, а также различные режимы наложения, но он все равно добавляет черный фон к исходному четкому изображению. Я могу настроить GLKView на прозрачный фон, но рендеринг изображения, а затем рисование его содержимого в CGImage не работает.

Кто-нибудь знает, почему это так?


person some_id    schedule 11.10.2017    source источник
comment
возможно, это поможет: stackoverflow.com/questions/5283670/   -  person Elano Vasconcelos    schedule 12.10.2017
comment
Спасибо, я могу рендерить с прозрачным фоном в GLKView, просто при рендеринге в другом контексте фон черный. Я также не могу просто взять изображение из иерархии GLKView, так как есть дополнительная отрисовка анимации, которую я хочу исключить.   -  person some_id    schedule 12.10.2017


Ответы (1)


Я считаю, что ваша проблема заключается в том, как создать UIImage из необработанных данных RGBA. Чтобы убедиться в этом, вы можете проверить свои данные на пикселе, который, как вы знаете, является прозрачным. Например, data[pixelIndex*4 + 3] должен быть равен нулю там, где вы ожидаете, что он будет прозрачным. Если он не прозрачен, проблема в части openGL.

В любом случае наиболее вероятная причина, по которой ваше изображение не прозрачно, заключается в том, что вы предварительно умножаете альфа-канал, используя kCGImageAlphaPremultipliedLast. Попробуйте использовать kCGBitmapByteOrder32Big|kCGImageAlphaLast.

person Matic Oblak    schedule 12.10.2017
comment
В итоге я решил это с помощью CIImageFilter - CIMaskToAlpha, а затем нарисовал изображение в режиме шаблона и установил цвет оттенка изображения. - person some_id; 14.10.2017