2

我使用 Apple 的实现将 OpenGL 视图渲染到 UIImage:http: //developer.apple.com/library/ios/#qa/qa1704/_index.html

这是在模拟器上运行的,但是当我在设备上尝试它时,它只显示一个空白图像。

我正在使用的代码是这样的:

// OpenGL view rendering to UIView
- (UIImage*)snapsotOfOpenGLView:(UIView*)eaglview
{
   GLint backingWidth, backingHeight;

  // Bind the color renderbuffer used to render the OpenGL ES view
  // If your application only creates a single color renderbuffer which is already bound       at this point,
  // this call is redundant, but it is needed if you're dealing with multiple renderbuffers.
  // Note, replace "_colorRenderbuffer" with the actual name of the renderbuffer object defined in your class.

  //    glBindRenderbufferOES(GL_RENDERBUFFER_OES, _colorRenderbuffer);

  // Get the size of the backing CAEAGLLayer
  glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
  glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

  NSInteger x = 0, y = 0, width = backingWidth, height = backingHeight;
  NSInteger dataLength = width * height * 4;
  GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));

  // Read pixel data from the framebuffer
  glPixelStorei(GL_PACK_ALIGNMENT, 4);
  glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);

  // Create a CGImage with the pixel data
  // If your OpenGL ES content is opaque, use kCGImageAlphaNoneSkipLast to ignore the  alpha channel
  // otherwise, use kCGImageAlphaPremultipliedLast
  CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);
  CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
  CGImageRef iref = CGImageCreate(width, height, 8, 32, width * 4, colorspace,  kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast,
                                ref, NULL, true, kCGRenderingIntentDefault);

  // OpenGL ES measures data in PIXELS
  // Create a graphics context with the target size measured in POINTS
  NSInteger widthInPoints, heightInPoints;
  if (NULL != UIGraphicsBeginImageContextWithOptions) {
      // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
      // Set the scale parameter to your OpenGL ES view's contentScaleFactor
      // so that you get a high-resolution snapshot when its value is greater than 1.0
      CGFloat scale = eaglview.contentScaleFactor;
      widthInPoints = width / scale;
      heightInPoints = height / scale;
      UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthInPoints, heightInPoints), NO, scale);
  } else {
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
    widthInPoints = width;
    heightInPoints = height;
    UIGraphicsBeginImageContext(CGSizeMake(widthInPoints, heightInPoints));
  }

  CGContextRef cgcontext = UIGraphicsGetCurrentContext();

  // UIKit coordinate system is upside down to GL/Quartz coordinate system
  // Flip the CGImage by rendering it to the flipped bitmap context
  // The size of the destination area is measured in POINTS
  CGContextSetBlendMode(cgcontext, kCGBlendModeCopy);
  CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, widthInPoints, heightInPoints), iref);

  // Retrieve the UIImage from the current context
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  // Clean up
  free(data);
  CFRelease(ref);
  CFRelease(colorspace);
  CGImageRelease(iref);

 return image;
}

有谁知道为什么会发生这种情况?

我在 XCode 4.5 和 iOS 5.1 和 6.0 模拟器上进行了尝试,它可以工作。

它不适用于 iPad2 iOS 6.0.1 和 iPhone 4S iOS 6.0.1 设备

谢谢。

4

0 回答 0