2012-11-06 44 views
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); 

有沒有人有任何想法發生了什麼?它把我逼瘋:(

回答

1

原來這是iOS6的是多一點挑剔設置kEAGLDrawablePropertyRetainedBacking ...

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], 
            kEAGLDrawablePropertyRetainedBacking, 
            kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, 
            nil]; 

here

+2

這樣做的原因是沒有這麼多的iOS 6對保留的支持更加挑剔,這是因爲從幀緩衝區中讀取到屏幕後的讀取是不受支持的操作,並且iOS 6.0最終強制執行此操作。保留支持是保持此內容的一種方式,但這樣做可能會產生負面影響性能的影響。或者,你可以在-presentRenderbuffer之前使用glReadPixels():來獲取你的re沒有保留的背景。 –