2011-08-16 3 views
1

QGLWidget에서 glVertex3f와 같은 다양한 OpenGL 함수에 대한 함수 호출을 Qt에서 처리하는 방법은 무엇입니까?QGLWidget의 glXXX 함수 호출은 어떻게 처리됩니까?

이 호출은 QGLWidget 객체의 일부입니까? 아니면 엄격하게 전역 이름 공간 OpenGL 함수입니까?

별도의 클래스에서 QGLWidget을 그리는 가장 좋은 방법은 무엇입니까?

답변

3

gl… 기능은 일반의 OpenGL 기능, 또는. QGLWidget은 GLUT 또는 GLFW처럼 OpenGL 컨텍스트 생성 및 관리를 담당합니다.

QGLWidget는 QGLWidget 인스턴스의 OpenGL은 문맥 QGLWidget::makeCurrent 호출되는 스레드의 현재 컨텍스트 선택되는 구성원 QGLWidget::makeCurrent 기능을 제공한다. QGLWidget::swapBuffers은 이중 버퍼 스왑을 발행합니다. OpenGL 컨텍스트 사용을 마친 후에 렌더러 함수의 끝에서 말하면 QGLWidget::doneCurrent을 호출하면 현재 스레드에서 컨텍스트가 분리됩니다. 다중 스레드 프로그램에서 OpenGL을 작동시키는 것이 필요합니다. 모든 OpenGL 작업이 동일한 스레드에서 수행되는지 확인하려면 QGLWidget::doneCurrent에 대한 호출을 생략 할 수 있습니다.

물론 진정한 OOP 패션 프로그램에서는 다른 클래스에 대한 참조를 QGLWidget 파생에 전달하고 QGLWidget의 드로잉 핸들러에서 해당 드로잉 함수를 호출해야합니다.

+1

정보 용으로'swapBuffers'는'paintGL'이 반환 된 후에 자동으로 호출됩니다. –

+0

확장 래퍼에 대해 자세히 설명합니다. Qt는 OpenGL 함수 포인터를로드하고 바인딩하는 QGL/[QOpenGLFunctions] (http://doc.qt.io/qt-5/qopenglfunctions.html) (QOpenGLFunctions_2_1에서 버전 관리 됨) 클래스를 제공합니다. 결과는 각 컨텍스트에 대해 캐시됩니다. QOpenGLContext :: currentContext() -> functions() -> gl을 사용하여 컨텍스트에 바인딩 된 함수를 직접 호출 할 수도 있습니다. – Bim

1

이들은 글로벌 네임 스페이스 OpenGL 기능입니다.

paintGL() 함수에서 다른 클래스의 그리기 함수를 호출하십시오. 연장으로 래퍼 래퍼의 심볼 해결 매크로 이름을 사용하는 경우

void MyGLWidget::paintGL() 
{ 
    other->draw(); 
}