0

私はここで新しく、Qt4のopenglについて質問があります。これは、過去数か月にわたって学習してきました。

特に、QGLWidgetを使用してオブジェクト指向の方法でシーンを構成するための最良の方法についてアドバイスを求めています。理想的には、シーン内のすべてのアイテムをスーパー「エンティティ」クラスのサブクラスにしたいと思います。次に、メインのQGLWidgetで、エンティティを並べ替えて、それに応じてレンダリングできます。

ただし、特定のopenGL関数(bindTextureなど)をQGLWidget(またはウィジェットのQGLContext)から呼び出す必要があることに気付きました。現在、メインビューポートを制御するQGLWidgetへのポインターを各エンティティに渡し、それらの関数にアクセスできるように格納しています。これは良い考えですか?

どんなアドバイスもありがたく受け取られるでしょう、あるいは助けになるかもしれない良いウェブサイト/本への道順さえ。Blanchette / Summerfieldの本を持っていますが、OpenGLセクションは非常に短く、QtWebサイトのほとんどの例はかなり単純です。

ありがとう、ダン

4

2 に答える 2

1

Vime に同意します。あなたはシーン グラフを作成しており、そのオブジェクト階層を設計するための古典的なアプローチがいくつかあります。このようなエンジンの詳細については、Dave Eberly 著の「3D Game Engine Design」を参照してください。また、別の例としてOGREを参照してください。

特定のスレッドで一度にアクティブにできる GL コンテキストは 1 つだけなので、労力を節約するために 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()

Boxes と呼ばれるわずかに高いレベルの Qt/OpenGL の例があります。qt/demos/boxesQt 4.6 インストールのフォルダーから見つけることができます。

于 2010-01-26T16:17:54.530 に答える