CoreGraphics从OpenGL渲染的图像具有黑色背景

时间:2017-10-11 19:22:44

标签: ios opengl-es core-graphics glkit

我无法在CoreGraphics中使用透明背景从OpenGL上下文渲染图像。

渲染图像的背景为黑色。

这是绘图代码

   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);

我试图将opaque设置为false以及不同的混合模式,但它仍然会在原始清晰图像中添加黑色背景。我能够将GLKView设置为具有透明背景,但渲染图像然后将其内容绘制到CGImage中并不起作用。

有谁知道这是为什么?

1 个答案:

答案 0 :(得分:1)

我相信您的问题在于如何从原始RGBA数据创建UIImage。要确认这一点,您可以检查您认为透明的像素上的数据。像data[pixelIndex*4 + 3]一样,你希望它是透明的。如果它不透明,则问题出在openGL部分。

无论如何,您的图像不透明的最可能原因是您使用kCGImageAlphaPremultipliedLast预乘alpha。尝试使用kCGBitmapByteOrder32Big|kCGImageAlphaLast