寻求在Qt4中使用QGLWidget的建议

时间:2010-01-26 14:21:03

标签: c++ qt opengl qt4 qglwidget

我是新来的,在Qt4中有一个关于opengl的问题,我在过去几个月里一直在学习。

特别是,我正在寻找有关使用QGLWidget以良好的面向对象方式构建场景的最佳方法的建议。理想情况下,我喜欢我场景中的每个项目都是超级“实体”类的子类。然后在我的主QGLWidget中,我可以对实体进行排序并相应地渲染它们。

我注意到需要从QGLWidget(或小部件的QGLContext)调用某些openGL函数(如bindTexture)。目前我正在传递一个指向QGLWidget的指针,该指针控制我对每个实体的主视口并存储它以便我可以访问这些功能。这是个好主意吗?

任何建议都会被感激不尽,甚至是指向可能有用的好网站/书籍的指示。我有Blanchette / Summerfield的书,但OpenGL部分很短,Qt网站上的大部分例子都非常简单。

谢谢, 丹

2 个答案:

答案 0 :(得分: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成员函数的几种情况下简单地调用MyGLWidget::GetActiveWidget(),而不需要在整个地方复制(可能是不变的)指针。

答案 1 :(得分:0)

您正在构建通常称为“场景图”的内容。在我们的引擎场景中,图形对象无需访问QGLWidget。如果您在void initializeGL()中创建OpenGL对象并在void paintGL()内渲染所有内容就足够了。

有一个稍高级别的Qt / OpenGL示例名为Boxes。可以在Qt 4.6安装中的qt/demos/boxes文件夹中找到它。