【问题标题】:CoreGraphics Image render from OpenGL has black background来自 OpenGL 的 CoreGraphics 图像渲染具有黑色背景
【发布时间】:2017-10-11 19:22:43
【问题描述】:

我无法在 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 中不起作用。

有人知道这是为什么吗?

【问题讨论】:

  • 谢谢,我可以在 GLKView 中使用透明背景进行渲染,只是在将其渲染到另一个上下文时,背景是黑色的。我也不能简单地从 GLKView 层次结构中获取图像,因为我想排除其他动画绘图。

标签: ios opengl-es core-graphics glkit


【解决方案1】:

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

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

【讨论】:

  • 我最终用 CIImageFilter - CIMaskToAlpha 解决了这个问题,然后用模板模式绘制图像并设置 imageView 的色调
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2014-01-04
  • 2021-11-15
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多