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