2010-12-08 3 views
14

하나의 스레드에서 내 장면을 렌더링 한 다음 다른 스레드가 소유 한 창에 결과를 블렌드하고 싶습니다. 프레임 버퍼를 CPU 메모리로 다시 읽지 않으려면 framebuffer 객체를 사용하고 싶습니다. 지금까지 나는 이것을 (white texture) 작동시키지 못했고, 이것이 내가 OpenGL에 의해 지원되지 않는다고 믿게한다.컨텍스트/스레드간에 OpenGL 프레임 버퍼 객체를 공유 할 수 있습니까?

  1. 다른 컨텍스트간에 프레임 버퍼 개체를 공유 할 수 있습니까?
  2. 개체가 한 번에 하나의 스레드에 의해서만 바인딩된다는 점을 고려하면 다른 스레드간에 프레임 버퍼 개체를 공유 할 수 있습니까?

설명서에 설명되어있는 부분을 누군가가 지적하면 보너스가됩니다.

+0

작업 샘플 코드 (죽었거나 살아있다)에 대해 누구에게나 현상금이 수여됩니다. - 또는 적어도 단계별 가이드로 FBO 공유를 설정하거나 텍스처와 렌더 버퍼를 공유하여 구현하십시오. – Suma

+0

@Suma 질감 공유는 플랫폼에 따라 다릅니다. Windows에서는 wglShareLists()를 사용하여 glFramebufferTexture()로 FBO에 첨부 된 텍스처를 생성해야합니다. 내 이해 OpenGL 구현/버전을 직접 FBO 공유 할 수없는 경우에도 다른 컨텍스트에서이 질감을 사용할 수 있어야합니다. – Plow

+0

그래, 이걸 이해 하긴하지만, 정확히 어떻게하면 이걸 할 수 있었는지, 내가 이미 알고있는 것에 기초하여 실험 할 때, 지금까지는 제대로 할 수 없었던 완전한 예제를 찾을 수 없었다. 인터넷 검색에서 이와 비슷한 질문이 여러 포럼에서 여러 번 묻지 만 대답은 결코 만족스럽지 않습니다. (OP와 마찬가지로 지금은 Windows에 관심이 있습니다.) – Suma

답변

9

다른 컨텍스트간에 프레임 버퍼를 공유 할 수 없습니다. 부록 D, OpenGL 3.3 스펙의 첫 번째 단락을 참조하십시오. 그러나 텍스쳐와 렌더 버퍼를 공유 할 수 있기 때문에 필요한 것을 줄 수 있습니다.

스레딩은 가능해야하지만 일반적으로 여러 스레드에서 GL 명령을 실행하지 않는 것이 좋습니다 (동기화하기가 매우 어렵 기 때문에). 일반적으로 내용을 픽셀 버퍼 객체에 복사 한 다음 GL 스레드에서 매핑 한 다음 다른 스레드에서 매핑 된 포인터를 사용합니다.

+5

Ragarding multithreading : 여러 스레드의 렌더링 호출을 섞어서는 안되는 것이 사실이지만, 렌더링 컨텍스트는 스레드간에 완벽하게 마이그레이션 될 수 있습니다. 모든 단일 렌더링 컨텍스트는 한 번에 하나의 스레드에서만 활성화 될 수 있지만 컨텍스트 (MakeCurrent (NULL))를 완벽하게 분리하고 나중에 다른 스레드에 다시 연결할 수 있습니다. – datenwolf

+1

스펙은 FBO를 공유 가능으로 나열하지 않지만 특별히 FBO를 제외하지는 않습니다. FBO를 공유 가능으로 표시하는 페이지 (http://www.pyglet.org/doc/programming_guide/sharing_objects_between_contexts.html)를 발견했습니다. 그렇다면 잘못된 것입니까? – Suma

+4

다른 OGL 버전에서는 FBO 공유가 다른 것 같습니다. Cf. http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=270430&page=2 ("GL 2.1 및 EXT_fbo를 사용하는 경우 FBO ID가 공유됩니다 ... GL 3.0을 사용하는 경우 (전달), FBO ID가 공유되지 않습니다. ") – Suma