2012-11-06 3 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; 

시뮬레이터에서 완벽하게 작동합니다. 불행히도 아이폰 4S glReadPixels에서 실행하려고 할 때 아무것도하지 않는다. 고의적으로 배열을 0xff에 memset하여 아무것도 수행하지 않고 배열을 설정하는 것이 중요하지 않은지 확인할 수 있습니다. 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]; 

는 그 이유가 아이폰 OS 너무 많이하지 here

+2

를 참조 날 운전 6은 유지 된 백업에 대해 더 까다 롭습니다. 화면에 표시된 후에 프레임 버퍼에서 읽는 것이 지원되지 않는 작업이므로 iOS 6.0에서이를 적용합니다.이 내용을 유지하는 한 가지 방법은 백업을 유지하는 것이지만 부정적인 방법이 될 수 있습니다 또는 -presentRenderbuffer 앞에 glReadPixels()를 사용할 수 있습니다. 유지 된지지없이 이미지를 낸다. –

관련 문제