Iphone iOS中的OpenGL ES缓冲区?
我在iOS上从OpenGL捕获图像时遇到了一个奇怪的问题。我使用苹果的示例代码创建了一个视图,允许用户对图像进行注释。生成的绘制视图随后作为用户输入表单的一部分添加到各种UITableViewCell中。完成表单后,使用以下采样代码(在my PaintingView中)将用户注释捕获到UIImage 在我的应用程序中,用户可以在两个表单之间切换,这两个表单都包含一个用于注释的PaintingView。如果用户提交初始表单,或切换到辅助表单,则图像捕获工作正常。如果用户提交初始表单,然后从切换到辅助表单,那么原始注释中的工件将显示在第二个表单上 在这里,用户注释并提交初始表单。 在这里,一旦用户开始注释辅助表单,就会出现来自初始表单的工件。Iphone iOS中的OpenGL ES缓冲区?,iphone,ios,ipad,opengl-es,Iphone,Ios,Ipad,Opengl Es,我在iOS上从OpenGL捕获图像时遇到了一个奇怪的问题。我使用苹果的示例代码创建了一个视图,允许用户对图像进行注释。生成的绘制视图随后作为用户输入表单的一部分添加到各种UITableViewCell中。完成表单后,使用以下采样代码(在my PaintingView中)将用户注释捕获到UIImage 在我的应用程序中,用户可以在两个表单之间切换,这两个表单都包含一个用于注释的PaintingView。如果用户提交初始表单,或切换到辅助表单,则图像捕获工作正常。如果用户提交初始表单,然后从切换到辅
这个问题似乎与采样代码有关,因为它只在采样之后出现(我可以在表单之间切换并注释每个表单,只要我不先采样就可以了)。知道这里发生了什么吗?我不确定这里到底是什么问题(看起来缓冲区内存被破坏了,但我找不到地址空间可能重叠的地方) 最初的Apple代码使用LayoutSubView在布局发生变化时动态调整绘制表面的大小,并在每次调用时删除和重新创建帧缓冲区。因为我将绘制视图放在表视图单元格中,所以在滚动期间会多次调用layoutSubviews,从而导致不必要地多次创建和删除缓冲区。似乎通过这些多次调用,缓冲区地址空间在某个地方被破坏了 在将缓冲区分配移动到我的初始化例程中,以便只执行一次之后,一切正常
- (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;
}