I was wondering if anyone could provide an example of how to take a screenshot which mixes OpenGL and UIKit elements. Ever since Apple made UIGetScreenImage()
priva
This should do the trick. Basically rendering everything to CG and creating an image you can do whatever with.
// In Your UI View Controller
- (UIImage *)createSavableImage:(UIImage *)plainGLImage
{
UIImageView *glImage = [[UIImageView alloc] initWithImage:[myGlView drawGlToImage]];
glImage.transform = CGAffineTransformMakeScale(1, -1);
UIGraphicsBeginImageContext(self.view.bounds.size);
//order of getting the context depends on what should be rendered first.
// this draws the UIKit on top of the gl image
[glImage.layer renderInContext:UIGraphicsGetCurrentContext()];
[someUIView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Do something with resulting image
return finalImage;
}
// In Your GL View
- (UIImage *)drawGlToImage
{
// Draw OpenGL data to an image context
UIGraphicsBeginImageContext(self.frame.size);
unsigned char buffer[320 * 480 * 4];
CGContextRef aContext = UIGraphicsGetCurrentContext();
glReadPixels(0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, &buffer);
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320 * 480 * 4, NULL);
CGImageRef iref = CGImageCreate(320,480,8,32,320*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, ref, NULL, true, kCGRenderingIntentDefault);
CGContextScaleCTM(aContext, 1.0, -1.0);
CGContextTranslateCTM(aContext, 0, -self.frame.size.height);
UIImage *im = [[UIImage alloc] initWithCGImage:iref];
UIGraphicsEndImageContext();
return im;
}
Then, to create a screenshot
UIImage *glImage = [self drawGlToImage];
UIImage *screenshot = [self createSavableImage:glImage];