OpenGL视图的UIImage渲染无法在设备上运行

时间:2013-02-14 17:38:31

标签: ios opengl-es uiimage screenshot device

我使用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

感谢。

0 个答案:

没有答案