2011-12-28 4 views
3

저는 OpenGL ES 2.0 및 GLSL 셰이더를 사용 중이며 Renderbuffer, 즉 오프 스크린 렌더링과 함께 FBO에서 작업하고 있습니다.
30fps으로 잘 작동합니다.
그러나 glReadPixels 또는 glcopyteximage2d를 사용하면 8fps으로 떨어집니다.
내가 좋아하는 뭔가 않았다
FBO가있는 glReadPixels가 너무 느립니다.

glBindFramebuffer(GL_FRAMEBUFFER, frameBuf); 
//DRAW something 
glReadPixels(...); //HERE 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

내가 속도를 향상시킬 수 어쨌든 있나요? FBO를 사용하지 않고 동일한 매개 변수로 glReadPixels를 사용하면 15fps이 작동하고 FBO를 사용하면 속도가 향상 될 수 있다고 생각합니까?

+1

당신은'glReadPixels()'등을 사용하여 스크린 밖의 렌더링을 화면에 복사하고 있습니까? 서페이스로 렌더링하는 경우 직접 렌더링하지 마십시오 (또는 OpenGL ES를 전혀 사용하지 않았습니다.). – Bojangles

+0

그렇습니다. glsl 쉐이더를 사용하고 있으며 조각 쉐이더가 출력하는 것은 무엇이든간에, 뭔가를 계산할 수 있도록 프레임 버퍼에 액세스/읽기해야합니다. 내 유휴 목표는 프레임 버퍼, 오프 스크린, 무언가를 읽은 다음 최종 화면을 그립니다. – user2168

+1

그래서 2 개의 텍스처를 만들고 FBO에 하나를 바인딩하고 다른 하나는 입력 텍스처로 바인딩합니다. 그런 다음 FBO를 두 번째 바운드로 전환하고 첫 번째를 질감으로 사용합니다. 복사하지 마십시오. (만약 ES가 그것을 지원한다면 - 나는 그것들을 내 손에서 알지 못한다 - FBO와 텍스쳐로 그것들을 묶을 수 있고 어떤 텍스쳐를 읽을지를 결정할 것인데 어떤 텍스쳐를 읽을지를 결정하고 다른 MRT. 정확성을 위해 핑과 퐁 사이에 "다른 것"을 넣으면 정상적으로 "여전히 작동"하지만 NV_texture_barrier와 같이 데이터가 다시 읽히기 전에 캐시가 동기화되도록 동기화해야합니다. – Damon

답변

5

glGet*** 함수 중 하나를 사용하여 OpenGL 데이터를 가져 오는 것은 좋지 않습니다. 텍스처를 복사하거나 일부를 화면/다른 텍스처로 복사하려면 쿼드로 그릴 수 있습니다. 일부 논리 처리를 위해 픽셀 데이터가 필요한 경우 프레임 버퍼를 가능한 작게 만들고 필요할 때만 읽을 수 있습니다.

관련 문제