2010-12-05 3 views
6

CAD와 유사한 응용 프로그램 (Qt 기반)을 만들고 있는데, 다중 문서 인터페이스이며 각 문서에는 약 5 개의 뷰포트 (QGLWidget에서 파생 됨)가 포함됩니다. 따라서 플랫 쉐이더를 전체 애플리케이션에서 공유해야하고 3D 자산 (VBO로 저장된 모델)을 각 문서, 즉 5 개의 뷰포트에서 공유해야합니다.OpenGL 리소스 공유를위한 전략

셰이더 프로그램과 VBO GLuint 주소를 공유하는 한 모든 것이 자동으로 작동한다는 것을 알았습니다. 각 뷰포트/컨텍스트에 그래픽 카드의 자체 주소 공간이 있기 때문에 누구나 잘 알고 있으면 알려 주시기 바랍니다.

응용 프로그램 시작시 셰이더를 컴파일하고 싶습니다. 그러나 OpenGL을 올바른 상태로 가져 오려면 유효한 QGLWidget이 필요하므로 어렵습니다. 그러나 QGLWidget을 (생성자를 통해) 공유하여 리소스를 공유해야하므로 다른 것들을 인스턴스화하기 전에 이 표시되고으로 표시되어야합니다. 그러나 이는 사용자에게 한 번에 여러보기가 표시되기 때문에 비현실적입니다.

이것은 획기적인 일이 아니기 때문에 내가 작성한 것보다 쉬워야하지만 정말 고민 중입니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

감사, 캠

답변

11

다음은 일반적인 CAD/MDI 응용 프로그램이하고있는 작업은 다음과 같습니다

  • 들이 자원을 공유, 잘위한 역할을하는 공유 컨텍스트을 만들 수 있습니다.

  • 공유 컨텍스트의 리소스 ID에 대한 액세스 권한을 부여하기 위해 새 OpenGL 렌더링 컨텍스트를 만들 때 wglShareLists을 사용합니다.

wglShareLists는 등 VBOs, 텍스처, 쉐이더를 공유하기 위해 사용할 수 있습니다뿐만 아니라 표시 목록 (DL을 공유하면 기존의 사용, 따라서 함수 이름입니다).

공유 컨텍스트로 리소스를 만들어야하는지 또는 어떤 컨텍스트에서 만들 수 있는지 기억이 안납니다.

창문이없는 경우 glXCreateContext을 참조하십시오. 그것은 당신을 궤도에 올려 놓아야합니다.

편집 :이 멤버 QGLContext::create와 추상화처럼 내가 Qt를 검토 한

, 그것은 보인다.

+2

우수! QGLContext는 약간 고립 된 dud입니다. create 메소드는 일단 디스플레이 장치가 생성 된 후에 만 ​​실행될 수 있습니다. 제 경우에는 QGLWidget 내부에 있습니다. 따라서 셰이더 컴파일 컨텍스트로 _invisible_ QGLWidget을 만든 다음 VBO 데이터를 보유하고있는 문서의 숨겨진 QGLWidget의 생성자에 const QGLWidget * shareWidget arg를 전달하고 해당 위젯을 표시 가능한 뷰포트 QGLWidgets에 전달합니다. 기본적으로 QGLWidget 트리 계층 구조를 생성합니다. 보이지 않는 GUI 구성 요소를 만드는 것은 멋지지 않지만 포팅과 관련하여 많은 타이핑을 줄일 수 있습니다. – cmannett85

+0

@ cmannett85 사실, * 클래스입니다. http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/ – mlvljr