繁体   English   中英

iOS中的OpenGL ES缓冲区?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM