已经在这个问题上苦苦挣扎了很长时间了,到目前为止还没有找到答案。基本上,我想做的是捕获EAGLview的内容,然后将其与其他图像合并。无论如何,主要的问题是,当我将其保存到相册或放入UIImageView时,EAGLview中所有透明的东西都变得不透明。让我与您分享一些代码,我在其他地方找到了:
- (CGImageRef) glToUIImage {
unsigned char buffer[320*480*4];
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(),kCGBitmapByteOrderDefault,ref,NULL,true,kCGRenderingIntentDefault);
size_t width = CGImageGetWidth(iref);
size_t height = CGImageGetHeight(iref);
size_t length = width*height*4;
uint32_t *pixels = (uint32_t *)malloc(length);
CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextTranslateCTM(context, 0.0, height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0.0, 0.0, width, height), iref);
CGImageRef outputRef = CGBitmapContextCreateImage(context);
UIImage *outputImage = [UIImage imageWithCGImage:outputRef];
UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil);
return outputRef;
}
正如我已经提到的那样,这完全可以捕获EAGLview的内容,但是我无法获得带有其alpha值的图像。
任何帮助表示赞赏。谢谢!
最佳答案
我可以在两个地方看到您可能会失去透明度:
绘制场景时:场景是否具有透明背景?确保对(0,0,0,0)而不是(0,0,0,1)做glClear。
在绘制图像以进行翻转时:此处的默认背景色是什么?看来这是一种不透明的黑色,您最终会得到场景的透明部分所处的位置。
您可以通过在翻转图像之前保存图像来检查#2是否是您的问题,如果是,则可以通过直接翻转像素缓冲区中的内存而不是使用Core Graphics调用来避免翻转过程。
关于iphone - 在iPhone上使用Alpha channel 捕获EAGLview内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/962390/