[英]OpenGL ES Buffer in iOS?
我在iOS上从OpenGL捕获图像时遇到一个奇怪的问题。 我已使用Apple的GLPaint示例代码创建了一个视图,该视图允许用户注释图像。 然后将生成的绘画视图作为用户输入表单的一部分添加到各种UITableViewCells中。 表单完成后,用户的注释将通过以下示例代码(在我的PaintingView中)捕获到UIImage中。
- (UIImage*)getImage {
// calculate buffer size
NSInteger dataLength = backingWidth * backingHeight * 4;
void *buffer = (GLubyte*)malloc(dataLength);
GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));
// transfer image from frame buffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, data);
// capture image
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef imageRef = CGImageCreate(backingWidth, backingHeight, 8, 32, backingWidth * 4, colorSpace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast, ref, NULL, true, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0f orientation:UIImageOrientationDownMirrored];
// clean up
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpace);
CGDataProviderRelease(ref);
free(buffer);
free(data);
// capture image
if( image == nil)
NSLog(@"Save EAGLImage failed to bind data to a UIImage");
return image;
}
在我的应用程序中,用户可以在两个窗体之间切换,这两个窗体都包含用于注释的单个PaintingView。 如果用户提交初始表单或切换到辅助表单,则图像捕获就可以正常工作。 但是,如果用户提交了初始表单,则从原始表单切换到辅助表单,原始注释中的工件会出现在第二个表单上。
在此,用户注释并提交初始表单。
在这里,一旦用户开始注释辅助表单,就会出现来自初始表单的工件。
这个问题似乎与采样代码有关,因为它仅在采样之后才会出现(只要我不首先采样,我就可以在表单之间切换并为每个表单添加注释而没有问题)。 有什么想法吗?
我不确定这到底是什么问题(缓冲存储器似乎已损坏,但我无法找到地址空间可能重叠的地方)。
最初的Apple代码正在使用layoutSubviews来动态调整绘画表面的大小(如果布局发生更改),并且在每次调用时都删除并重新创建了帧缓冲区。 因为我将绘画视图放置在表视图单元格中,所以在滚动过程中多次调用layoutSubviews,导致不必要地多次创建和删除缓冲区。 似乎通过这些多次调用在某个地方缓冲区地址空间开始损坏。
将缓冲区分配移到我的初始化例程后,它仅执行一次,一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.