マトリックス スタックのように機能する環境設定 (ブレンド、ステンシル、深さなど) の OpenGL で抽象化を作成したいと思います。スタックにプッシュし、必要な変更を行い、オブジェクトを描画してから、スタックをポップして以前の設定に戻ります。
たとえば、現在、次のような描画コードがあるとします。
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
//Draw operations
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
しかし、環境スタックを使用すると、次のようになります。
glPushEnv();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
//Draw operations
glPopEnv();
私が見ているように、これを行うには2つの方法しかありません:
- 各環境設定関数の独自の「フレーバー」を作成し、それを呼び出します。次に、現在の EnvStack データ構造を更新し、OpenGL 環境関数を呼び出します。
- OpenGL 環境関数を変更して、環境関数を指すようにします。これにより、現在の EnvStack データ構造が再び更新され、元の OpenGL 環境関数が呼び出されます。
したがって、オプション 1 は明らかにはるかに単純です。しかし、他の人のコードを使用している場合、それが環境にどのような変更を加えているのか必ずしもわからないため、データ構造が同期しなくなるという問題が発生します。そして、要点は、環境設定が正しいことを確認する簡単な方法を持つことであるため、これはクールではありません。
私の質問は、このコンテキストで、OpenGL 環境関数が指す関数をどのように変更すればよいですか?