0

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

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

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

我们将不胜感激地收到任何建议,甚至是对可能有帮助的好网站/书籍的指导。我有 Blanchette/Summerfield 的书,但是 OpenGL 部分很短,而且 Qt 网站上的大多数示例都非常简单。

谢谢,丹

4

2 回答 2

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();
    // ...
}

然后在您的实体类中,您可以MyGLWidget::GetActiveWidget()在需要调用 QGLWidget 成员函数的少数情况下简单地调用,而无需到处复制(可能是不变的)指针。

于 2010-01-26T16:42:16.220 回答
0

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

有一个更高级别的 Qt/OpenGL 示例,称为 Boxes。它可以从qt/demos/boxesQt 4.6 安装的文件夹中找到。

于 2010-01-26T16:17:54.530 回答