2010-01-26 5 views
0

저는 여기 새로 왔으며 지난 몇 달 동안 배웠던 Qt4에서 OpenGL에 관한 질문이 있습니다.Qt4에서 QGLWidget 사용에 대한 조언 받기

특히 QGLWidget을 사용하여 좋은 객체 지향 방식으로 장면을 구성하는 가장 좋은 방법에 대한 조언을 구합니다. 내 장면의 모든 항목이 슈퍼 '엔티티'클래스의 하위 클래스가되는 것이 이상적입니다. 그런 다음 내 주요 QGLWidget에서 엔티티를 정렬하여 그에 맞게 렌더링 할 수 있습니다.

QGLWidget (또는 위젯의 QGLContext)에서 특정 openGL 함수 (bindTexture와 같은)를 호출해야하지만 알아 챘습니다. 지금은 각 주체 뷰포트를 제어하는 ​​QGLWidget에 대한 포인터를 각 엔티티에 전달하고 해당 함수에 대한 액세스 권한을 얻을 수 있도록 저장합니다. 이것은 좋은 생각입니까?

감사의 말을 전하는 데 도움이 될만한 유용한 웹 사이트/서적에 대한 안내 또는 도움을 받으실 수 있습니다. 나는 Blanchette/Summerfield 책을 가지고 있지만 OpenGL 섹션은 매우 짧으며 Qt 웹 사이트의 예제는 매우 단순합니다.

감사합니다, 댄

답변

1

나는 Vime에 동의한다 : 당신은 씬 그래프를 만들고 있는데, 객체 계층을 디자인하기위한 많은 고전적인 접근법이있다. 이러한 엔진에 대한 자세한 내용은 Dave Eberly의 "3D Game Engine Design"을 확인하고 다른 예제는 OGRE을 확인하십시오.

하나의 GL 컨텍스트가 특정 스레드에서 한 번에 활성화 될 수 있기 때문에, 노력 저장 정적 클래스 멤버 같이 QGLWidget 포인터를 저장하는 고려 :

class MyGLWidget : public QGLWidget { 
    // ... 
public: 
    static inline MyGLWidget *GetActiveWidget() { 
     return ms_activeWidget; 
    } 
protected: 
    static __declspec(thread) MyGLWidget *ms_activeWidget = 0; // uses MSVC extension 
    inline void SetActiveWidget() { 
     ms_activeWidget = this; 
    } 
}; 

void MyGLWidget::paintGL() { 
    SetActiveWidget(); 
    // ... 
} 

그런 다음, 엔티티 클래스에 단순히 호출 할 수 있습니다를 MyGLWidget::GetActiveWidget() QGLWidget 멤버 함수를 호출 할 필요가있을 때가 있습니다. 그리고 그 곳 곳곳에 (아마도 불변 인) 포인터를 복사 할 필요는 없습니다.

+0

감사합니다 ChrisV, 귀하의 정적 클래스 멤버 예제는 끔찍한 짓을하고 그 일을 가지고있어. 나는 Eberly 서적을 가지고 있지만 자세히 읽지는 않았지만 지금은 장면 그래프의 섹션을 살펴 보았습니다. OpenSceneGraph는 어떻습니까? 나는 그것에 대해 조금은 들었고, 그것을보기 위해 그것을 다운로드했고, 그것에 관한 어떤 경험이 있었느냐? – talldan

+0

내가 OSG를 사용했을 때 나는 너무 인상적이지는 않았지만, 그것은 a) 몇 년 전이었고 b) 일반적으로 끔찍한 코드베이스의 일부였다. 객체 계층 구조 디자인은 나에게 호소하지 않았다. 저는 많은 OpenGL 개념을 직접 클래스로 매핑하려고 시도 했으므로 확실히 살펴볼 수 있습니다. 씬 그래프 라이브러리를 선택하는 것에 대한 조언이 있습니까? 수출업자들을보십시오.라이브러리로 쉽게 지오메트리를 가져올 수없는 경우 나머지 라이브러리의 디자인이 중요하지 않습니다. – ChrisV

0

당신은 일반적으로 "장면 그래프"라고 무언가를 구축하고있다. 우리의 엔진 장면에서 그래프 객체는 QGLWidget에 액세스 할 필요가 없습니다. void initializeGL() 안에 OpenGL 객체를 만들고 내부의 모든 것을 렌더링하면 충분합니다. void paintGL().

Boxes라는 다소 높은 레벨의 Qt/OpenGL 예제가 있습니다. Qt 4.6 설치시 qt/demos/boxes 폴더에서 찾을 수 있습니다.

+0

도움 주셔서 감사합니다. 이 예제는 매우 편리합니다. 이전에 장면 그래프에 대해 읽은 적이 있지만 완전히 구현 한 적이 없습니다. 나는 좀 더 심층적 인 절두체 컬링을 필요로하므로 더 자세히 조사 할 것이지만 너무 진보 된 것을 탐구하고 싶지는 않을 것입니다. 이것은 대학 프로젝트를위한 것이므로 자신과 튜터가 아닌 최종 사용자는 없습니다. 상대적으로 안정적이고 다른 개념을 증명할 수 있다면 그게 중요합니다. – talldan