2010-01-26 23 views
0

我是新來的,在Qt4中有一個關於opengl的問題,我在過去的幾個月裏一直在學習。在Qt4中尋求關於使用QGLWidget的建議

特別是,我正在尋求關於使用QGLWidget以良好的面向對象的方式組合場景的最佳方法的建議。我理想地喜歡我場景中的每一件物品都是超級「實體」類的子類。然後在我的主QGLWidget中,我可以對實體進行排序並相應地渲染它們。

我注意到,雖然某些openGL函數(如bindTexture)需要從QGLWidget(或小部件的QGLContext)中調用。此刻,我將一個指向QGLWidget的指針傳遞給每個實體,並存儲它以便我可以訪問這些函數。這是一個好主意嗎?

任何意見將受到感謝,甚至指示良好的網站/書籍,可能是有幫助的。我有Blanchette/Summerfield書,但OpenGL部分非常短,Qt網站上的大多數示例都非常簡單。

感謝, 丹

回答

1

我同意Vime:你正在構建一個場景圖,並且有許多經典的方法來設計它的對象層次結構。查看Dave Eberly的「3D遊戲引擎設計」,瞭解關於這種引擎的詳細信息,另外一個例子是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(); 
    // ... 
} 

然後在你的實體類,你可以簡單地調用當你需要調用QGLWidget成員函數,並且不需要在整個地方複製一個(可能是不變的)指針時,你可以在少數情況下調用這個函數。

+0

感謝ChrisV,你的靜態類成員的例子有很多意義,我已經有了這個工作。 我確實有Eberly的書,但沒有詳細閱讀,現在我已經開始關注場景圖的部分了。如何OpenSceneGraph?我已經聽說了一些,並下載它看看,有任何經驗呢? – talldan 2010-01-27 18:45:13

+0

有一次我使用OSG,我並沒有太留下深刻的印象,但那是幾年前和b)作爲一個通常糟糕的代碼庫的一部分。對象層次結構設計並沒有吸引我。既然我記得它試圖將許多OpenGL概念直接映射到類中,你當然可以看看它。 雖然我選擇場景圖庫的建議嗎?看看出口商。如果你不能很容易地將你的幾何圖形放入圖書館,那麼圖書館的其他部分設計得怎麼樣並不重要。 – ChrisV 2010-01-27 19:30:35

0

你正在建設的東西,通常被稱爲「場景圖」。在我們的引擎場景中,圖形對象不需要訪問QGLWidget。如果你在void initializeGL()內部創建OpenGL對象並且在void paintGL()內部渲染所有內容,就足夠了。

有一個稍高級別的Qt/OpenGL示例,稱爲Boxes。它可以從Qt 4.6安裝中的qt/demos/boxes文件夾中找到。

+0

感謝您的幫助。這個例子非常方便,我之前沒有遇到過。 我已經閱讀了一些關於場景圖的內容,但從未完全實現過。我絕對需要一些簡單的粗俗剔除,所以會進一步調查,但可能不想深入研究任何先進的東西。這是一個大學項目,除了我和導師,沒有最終用戶。只要它相對穩定,我能夠證明我的其他概念,那纔是重中之重。 – talldan 2010-01-27 18:43:01