2010-01-26 81 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