0
我正試圖在iPhone上截取GLView。我寫了下面的代碼:glReadPixels無法在iPhone上工作
[self setContext];
GLint backWidth, backHeight;
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backHeight);
int dataLength = backWidth * backHeight * 4;
uint32_t* pData = (uint32_t*)malloc(dataLength * sizeof(char));
memset(pData, 0xff, dataLength); // This is here to confirm some writing occurs in glReadPixels
// Read pixel data from the framebuffer
//glPixelStorei(GL_PACK_ALIGNMENT, 4);
glReadPixels(0, 0, backWidth, backHeight, GL_RGBA, GL_UNSIGNED_BYTE, pData);
fprintf(stderr, "%d\n", glGetError());
CGDataProviderRef cgDataProvider = CGDataProviderCreateWithData(NULL, pData, dataLength, DataProviderReleaseDataCallback);
CGColorSpaceRef cgColorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef cgImage = CGImageCreate( backWidth, backHeight, 8, 32, backWidth * 4, cgColorSpace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast,
cgDataProvider, NULL, true, kCGRenderingIntentDefault);
//NSData* pNSData = [[NSData alloc] initWithBytes: pData length: dataLength];
UIImage* pRetImage = [UIImage imageWithCGImage: cgImage scale: 1.0f orientation: UIImageOrientationDownMirrored];
CFRelease(cgDataProvider);
CFRelease(cgColorSpace);
CGImageRelease(cgImage);
//free(pData);
return pRetImage;
它在模擬器中完美地工作。不幸的是,當我嘗試在iPhone 4S上運行它時,glReadPixels什麼都不做。我故意將數組memset爲0xff,看看我是否可以看到它是否在做任何事情,並且無關緊要地設置數組glReadPixels什麼都不做。它也報告沒有錯誤。
我沒有使用多采樣緩衝區,除非iPhone爲我設置。
glGenRenderbuffers(1, &mGlRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, mGlRenderBuffer);
[mGlContext renderbufferStorage: GL_RENDERBUFFER fromDrawable: mGlLayer];
GLuint frameBuffer;
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mGlRenderBuffer);
有沒有人有任何想法發生了什麼?它把我逼瘋:(
這樣做的原因是沒有這麼多的iOS 6對保留的支持更加挑剔,這是因爲從幀緩衝區中讀取到屏幕後的讀取是不受支持的操作,並且iOS 6.0最終強制執行此操作。保留支持是保持此內容的一種方式,但這樣做可能會產生負面影響性能的影響。或者,你可以在-presentRenderbuffer之前使用glReadPixels():來獲取你的re沒有保留的背景。 –