Ios 使用深度缓冲区和抗锯齿技术时,glreadpixel()读取数据时出现问题

Ios 使用深度缓冲区和抗锯齿技术时,glreadpixel()读取数据时出现问题,ios,opengl-es,glreadpixels,Ios,Opengl Es,Glreadpixels,我想使用glreadpixel()捕获游戏屏幕。 在ios版本为3.1.1的2g iphone上,它也可以在模拟器上正常工作。 但在ios版本为4.2.1的ipad上,情况并非如此。我开始了解这方面的问题。适用于特定设备(ipad)上的ios 4.0以上版本 我们绑定深度缓冲区并使用抗锯齿技术。当我们使用opengl的glreadpixel()从帧缓冲区捕获数据时,会返回目标缓冲区中的所有0 如果我们不将深度缓冲区绑定到帧缓冲区,也不使用抗锯齿技术,那么效果很好 我使用的代码是:- CGRect

我想使用glreadpixel()捕获游戏屏幕。 在ios版本为3.1.1的2g iphone上,它也可以在模拟器上正常工作。 但在ios版本为4.2.1的ipad上,情况并非如此。我开始了解这方面的问题。适用于特定设备(ipad)上的ios 4.0以上版本 我们绑定深度缓冲区并使用抗锯齿技术。当我们使用opengl的glreadpixel()从帧缓冲区捕获数据时,会返回目标缓冲区中的所有0

如果我们不将深度缓冲区绑定到帧缓冲区,也不使用抗锯齿技术,那么效果很好

我使用的代码是:-

CGRect屏幕边界=[[UIScreen mainScreen]边界]

int backingWidth = screenBounds.size.width;
int backingHeight =screenBounds.size.height;

NSLog(@"width : %f Height : %f",screenBounds.size.width,screenBounds.size.height);
CGSize esize = CGSizeMake(screenBounds.size.width, screenBounds.size.height);
NSInteger myDataLength = esize.width * esize.height * 4;
GLuint *buffer = (GLuint *) malloc(myDataLength);
glReadPixels(0, 0, esize.width, esize.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
for(int y = 0; y < backingHeight / 2; y++) {
    for(int xt = 0; xt < backingWidth; xt++) {
        GLuint top = buffer[y * backingWidth + xt];
        GLuint bottom = buffer[(backingHeight - 1 - y) * backingWidth + xt];
        buffer[(backingHeight - 1 - y) * backingWidth + xt] = top;
        buffer[y * backingWidth + xt] = bottom;
    }
}
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releaseScreenshotData);
const int bitsPerComponent = 8;
const int bitsPerPixel = 4 * bitsPerComponent;
const int bytesPerRow = 4 * backingWidth;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(backingWidth,backingHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
/*
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
[snap setImage:myImage];
[self addSubview:snap];*/
int backingWidth=screenBounds.size.width;
int backingHeight=screenBounds.size.height;
NSLog(@“宽度:%f高度:%f”,屏幕边界。大小。宽度,屏幕边界。大小。高度);
CGSize esize=CGSizeMake(screenBounds.size.width,screenBounds.size.height);
NSInteger myDataLength=esize.width*esize.height*4;
GLuint*buffer=(GLuint*)malloc(myDataLength);
glReadPixels(0,0,esize.width,esize.height,GL_RGBA,GL_无符号字节,缓冲区);
对于(int y=0;y

在opegl es中使用glreadpixel()或任何其他类似函数时,您知道如何在抗锯齿中包含深度信息吗?

这不会解决您的问题,但会帮助您定制搜索。由于您使用的是OpenGL-ES
glReadPixels()
将无法读取深度缓冲区。我的应用程序目前也有同样的功能问题。

解决了!在调用glReadPixels()之前,必须将resolve帧缓冲区绑定回GL_帧缓冲区


在渲染下一帧之前,请确保将示例帧缓冲区绑定为GL_帧缓冲区,但默认的Apple模板已经做到了这一点。

没错!如果你有其他办法,请告诉我。同时,我应该继续搜索。还有,你知道如何检查glReadPixels中的pixelByteArray是否包含有效数据吗?你确定要在该像素上渲染任何内容吗?我从一个工作程序中复制/粘贴了它。我让它工作了,但还有一个问题…glReadPixels非常慢…当我使用它时,FPS从30-40降低到2-3,只有其他的选择吗?是的,glReadPixels的性能很差,原因有很多:它必须等待渲染完全完成,渲染后,它必须与CPU重新同步,而且在许多架构师看来,从CPU访问视频内存的速度非常慢(但我认为这不适用于iPhone)。不过,如果你需要在一次点击中检查一个像素,这也没关系。
glBindFramebuffer(GL_FRAMEBUFFER, resolveFramebuffer);
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
glReadPixels(xpos, ypos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixelByteArray);
glBindFramebuffer(GL_FRAMEBUFFER, sampleFrameBuffer);