簡體   English   中英

尋求有關在Qt4中使用QGLWidget的建議

[英]Seeking advice on using QGLWidget in Qt4

我是新來的,並且有一個關於Qt4中的opengl的問題,這是我過去幾個月來一直在學習的問題。

特別是,我正在尋求有關使用QGLWidget以良好的面向對象方式構圖場景的最佳方法的建議。 理想情況下,我希望場景中的每個項目都是超級“實體”類的子類。 然后,在我的主QGLWidget中,可以對實體進行排序並相應地渲染它們。

我注意到,盡管某些openGL函數(例如bindTexture)需要從QGLWidget(或窗口小部件的QGLContext)中調用。 目前,我正在將指向我的主視口的QGLWidget的指針傳遞給每個實體並將其存儲,以便我可以訪問這些功能。 這是一個好主意嗎?

我們將不勝感激地收到任何建議,甚至指導可能會有所幫助的優質網站/書籍。 我已經收到了Blanchette / Summerfield的書,但是OpenGL部分很短,而且Qt網站上的大多數示例都非常簡單。

謝謝,丹

我同意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成員函數的少數情況下,只需調用MyGLWidget::GetActiveWidget() ,而無需到處復制(可能不變的)指針。

您正在構建通常稱為“場景圖”的東西。 在我們的引擎場景中,圖形對象無需訪問QGLWidget。 如果在void initializeGL()內創建OpenGL對象並在void paintGL()內渲染所有內容,就void paintGL()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM