2016-10-11 15 views
-1

私は新しいOpenGLベースのレンダリングエンジンに取り組んできましたが、次の問題に遭遇しました。glClear(); glUniformxx, ...のようなOpenGL機能を公開したいのですが、呼び出し前にOpenGLコンテキストを作成する必要がありますそれらの機能のいずれか。問題は、OpenGL はコンテキストを管理していないので、gl関数を呼び出す前に定義されていない動作(ほとんどの場合segfault)が発生するという問題があります。ですから、私の質問はです。OpenGL関数が呼び出される前に、どのようにコンテキストを作成する必要がありますか?OpenGL - APIデザイン

  • 私の最初のアイデアは、すべてのOpenGLの機能を公開し、それが有効なコンテキストを渡された場合のみ、それらを呼び出すだろうと、シングルトンクラスと呼ばれるGLFeaturesを作成することでした。
+0

ほとんどの実装では、アクティブなコンテキストを管理するためにスレッドローカルストレージが使用されます。あなたはこれの上に独自のソリューションをレイヤーすることができます。アクティブなコンテキストを管理するウィンドウシステム関数をラップすると、呼び出し元のスレッドにアクティブなコンテキストがあるかどうかが常にわかり、必要な警告/エラーを生成したり発行したりすることができます。 –

答えて

0
ベース

TOTALLY意見:

私は、あなたがマルチウィンドウのレンダリングのためにそれらを切り替えることができ、このようにOpenGLのコンテキスト管理のための完全に異なるクラスを書くことをお勧めしたいです。あなたの "GLFeatures"クラスは、コンテキスト管理クラスへのポインタを設定する "SetCurrentContext"と呼ばれる関数を持つことができます。各関数の先頭にコンテキストポインタをアサートするだけで、コンテキストが初期化される前にすべての関数が呼び出されるのを防ぐことができます。

しかし、シングルトンを使用するだけで問題なく動作するはずですが、上記は私がそれを行う方法です。

+0

答えをありがとう:)あなたはシングルトンのすべてのglの機能をラップすることは良いデザインと考えられますか? – Coder32

+0

Shaderクラスなどの別々のクラスで状態を処理する方が良いですか? – Coder32

+0

OpenGLは表面下の巨大な状態マシンにすぎないことに注意してください。いくつかのOOPスタイルの抽象化を追加すると、これらの状態を管理するのに役立ちます。 – TheKitchenSink

関連する問題