OpenGLが機能する全体の方法は、OOPにうまくマッピングされていません:http ://www.opengl.org/wiki/Common_Mistakes#The_Object_Oriented_Language_Problem
この記事で述べられていないのは、コンテキストアフィニティの問題です。OpenGLでは、すべてがコンテキストで発生するため、クラス「Texture」は、正確には、コンテキストで使用される栄光のハンドルにすぎません。
これは間違っています:
class Texture {
/* ... */
public:
void bind();
}
テクスチャが現在アクティブなコンテキストの一部である場合にのみ機能します。
これも良くありません:
class Texture {
/* ... */
public:
void bind(Context &ctx);
}
テクスチャは引き続きコンテキストの一部である必要があり、現在アクティブであるctx
場合にのみ機能します。ctx
では、これについてはどうでしょうか。
class Context {
/* ... */
public:
void bindTextureToUnit(TextureUnit &tu, Texture &t);
};
コンテキストは現在のスレッドで現在アクティブになっている必要があるため、より適切ですが、それでも正しくありません。「ああ、コンテキストがアクティブでない場合は例外をスローする」と思うかもしれません。これをしないでください。
では、これはどうですか
class ActiveContext : Context {
/* ... */
public:
void bindTextureToUnit(TextureUnit &tu, Texture &t);
}
これで、スレッドごとにActiveContextインスタンスが1つだけ存在できることを確認することになりました。これは、あらゆる種類の奇妙なスレッドシングルトンの混乱に終わります。
実際、私はOpenGLの状態とオブジェクトからC ++クラスのセットにクリーンで健全なマッピングを実装しようと何度も試みましたが、それがうまくいかなかったり、ひどいコードの混乱に終わったりする場合が常にあります。
私見では、OpenGLAPIをC++クラスのセットにマッピングするのではなく(正しく行うことはできません)、代わりに特殊なクラスの通常のOpenGLAPIを使用する方がはるかに優れています。OpenGLコンテキスト管理は、質問のプログラムに大きく依存しているため、そのプログラムに合わせて特別に調整する必要があります。