2014-03-14 2 views
4

내가 작업하고있는 OpenGL ES 앱에서 glReadPixels() 기능이 모든 장치/시뮬레이터에서 작동하지 않는 것으로 나타났습니다. 이를 테스트하기 위해 베어 본 샘플 OpenGL 앱을 만들었습니다. 나는 EAGLContext 컨텍스트에 배경 색상을 설정하고 다음과 같이 glReadPixels()를 사용하여 픽셀을 읽으려고 :glReadPixels는 iOS 7 장치에서만 검은 색 이미지를 표시합니다.

아이폰 OS 6, 7 및 물리적 아이폰 OS 6 디바이스 시뮬레이터에서 예상대로이 작동
int bytesPerPixel = 4; 
int bufferSize = _backingWidth * _backingHeight * bytesPerPixel; 

void* pixelBuffer = malloc(bufferSize); 
glReadPixels(0, 0, _backingWidth, _backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixelBuffer); 

// pixelBuffer should now have meaningful color/pixel data, but it's null for iOS 7 devices 

free(pixelBuffer); 

하지만 실패한다 물리적 인 iOS 7 장치. 테스트 시나리오는 아래 표와 같습니다 (YES/NO = 작동하지 /하지 않습니다) :

Test

V2는 빠른 테스트 후 작동하지 비록 내가 (OpenGL을 ES 1.1 버전을 사용하고 있습니다).

사람이 문제가 발생 했습니까? 내가 놓친 게 있니? 가장 이상한 부분은 iOS 7 물리적 장치에서만 실패한다는 것입니다.

Here은 참조 용으로 모든 관련 코드와 기본 뼈가 GitHub project 인 요지입니다. 문제를 만들고 보여주기가 매우 쉬워졌습니다.

UPDATE : 여기

updated gist이며, GitHub project도 업데이트되었습니다. glReadPixels에서 메모리 출력을 쉽게 볼 수 있도록 샘플 프로젝트를 업데이트했습니다.

또한, 나는 새로운 관찰이 다음 EAGLContext는 레이어 백업 ([self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]) 인 경우, glReadPixels 성공적으로 모든 장치에서 데이터를 읽을 수/시뮬레이터 (아이폰 OS 6, 7). 그러나 문맥이 레이어 백업 ([self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil])이되지 않도록 GLView.m에서 플래그를 토글하면 glReadPixels은 초기 게시물에 표시된 조건을 나타냅니다 (iOS 6 sim/device, iOS 7 sim에서 작동하지만 iOS에서는 작동하지 않음). 7 장치).

+0

는이시기에 적절한 상황이 있습니까 아래와 같이 될 것이다, 또는 당신이 전에 명확한 호출하는 기회가 될 수 있을까? – prabindh

+2

코드를 복사했고 작동합니다. 버퍼를 표시하기 전에 read pixels 메서드를 호출해야합니다. –

+0

@prabindh이 전에는 분명히하지 않았습니다. –

답변

3

의견에 게시 된대로 귀하의 코드를 사용하여 관리했습니다. 그러나 뷰에서 렌더링 버퍼를 생성하는 사용자의 BACKING_TYPE_LAYERBACKED을 정의했습니다.

FBO를 만드는 다른 파이프 라인이 작동하지 않았습니다. FBO 파이프 라인의 문제는 [self.context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:nil]입니다. 이 줄을 빼면 괜찮을거야.

버퍼를 두 번째를 다시 사용하는 경우이 문제가 발생할 수 있습니다 사람들을 위해, 매틱 Oblak의 대답에서 계속
+0

감사! 그 라인이 iOS 7과 비교하여 iOS 6에서 다르게 작동 한 이유를 알고 있습니까? iOS 6 구현이 잘못 되었습니까? –

+1

나는 모르는게 있는데, nil 매개 변수를 전달하는 것에 관한 문서는 없다. 이 매개 변수의 값은 CAEAGLLayer 객체 여야합니다. 어쨌든 iOS 6에서는 아무런 의미가 없습니다. iOS 7에서는 아무 것도하지 않는 것 같습니다. –

0

(데이터 백업 - 저장하지 계층에서) 장치에, 당신은 프레임 버퍼, renderBuffer를 리 바인드해야합니다, objectpicking 같은 작업을위한 renderBuffer를 frameBuffer에 다시 첨부하십시오. 예컨대 들어 gistbindBuffers 기능은

- (void)bindBuffers 
{ 
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, _framebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, _renderbuffer); 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, _renderbuffer); 
} 
관련 문제