为什么glReadPixels()在iOS 6.0中的此代码中失败?

Gam*_*ing 18 opengl-es ios ios6

以下是我用于从OpenGL ES场景中读取图像的代码:

-(UIImage *)getImage{

    GLint width;

    GLint height;

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &height);


    NSLog(@"%d %d",width,height);

    NSInteger myDataLength = width * height * 4;

    // allocate array and read pixels into it.
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    // gl renders "upside down" so swap top to bottom into new array.
    // there's gotta be a better way, but this works.
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    for(int y = 0; y < height; y++)
        {
        for(int x = 0; x < width * 4; x++)
            {
            buffer2[((height - 1) - y) * width * 4 + x] = buffer[y * 4 * width + x];
            }
        }

    // make data provider with data.
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);

    // prep the ingredients
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * width;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    // make the cgimage
    CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

    // then make the uiimage from that
    UIImage *myImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpaceRef);
    free(buffer);
    free(buffer2);
    return myImage;

}
Run Code Online (Sandbox Code Playgroud)

这适用于iOS 5.x及更低版本,但在iOS 6.0上,现在返回黑色图像.为什么glReadPixels()在iOS 6.0上失败?

ka2*_*a2n 25

CAEAGLLayer *eaglLayer = (CAEAGLLayer *) self.layer;
eaglLayer.drawableProperties = @{
    kEAGLDrawablePropertyRetainedBacking: [NSNumber numberWithBool:YES],
    kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8
};
Run Code Online (Sandbox Code Playgroud)

kEAGLDrawablePropertyRetainedBacking = YES
Run Code Online (Sandbox Code Playgroud)

(我不知道为什么这个小费很顺利..///)

  • 原因可能是你在使用`[context presentRenderbuffer:GL_RENDERBUFFER];`来呈现内容后试图从屏幕上读取.除非您将图层设置为使用保留的支持,否则您无法保证在显示该内容后仍然保留此内容.似乎iOS 6.0在不再需要它之后更加积极地删除此内容.上面会导致性能下降,所以你可能最好不要执行`glFinish()`操作并在此之后捕获屏幕,然后呈现渲染缓冲区. (10认同)
  • 我也不知道它是如何工作但它只是工作:D (2认同)