OpenGLオブジェクト(テクスチャ、フレームバッファなど)用の簡単なRAIIラッパーを作成したいと思います。すべてglGen*
とglDelete*
の関数が同じシグネチャを共有しています。 :OpenGLオブジェクト用のRAIIラッパー
typedef void (__stdcall *GLGenFunction)(GLsizei, GLuint *);
typedef void (__stdcall *GLDelFunction)(GLsizei, const GLuint *);
template <GLGenFunction glGenFunction, GLDelFunction glDelFunction>
class GLObject
{
GLuint m_name;
public:
GLObject()
{
glGenFunction(1, &m_name);
}
~GLObject()
{
glDelFunction(1, &m_name);
}
GLuint getName() {return m_name;}
};
typedef GLObject<glGenTextures, glDeleteTextures> GLTexture;
これは、テクスチャの細かい動作しますが、フレームバッファのために失敗:glGenFramebuffers
とglDeleteFramebuffers
機能アドレスはコンパイル時に知られていない、とテンプレート引数として使用することはできません。だから私は、第二版作っ:
class GLObjectBase
{
GLuint m_name;
GLDelFunction m_delFunction;
public:
GLObjectBase(GLGenFunction genFunc, GLDelFunction delFunction)
: m_delFunction(delFunction)
{
genFunc(1, &m_name);
}
GLuint getName()
{
return m_name;
}
protected:
~GLObjectBase()
{
m_delFunction(1, &m_name);
}
};
class GLFrameBuffer : public GLObjectBase
{
public:
GLFrameBuffer() : GLObjectBase(glGenFramebuffers, glDeleteFramebuffers) {}
};
をしかし、私は実行時に変更されることはありません各インスタンスにおけるデルの関数ポインタを格納する必要があるので、私はそれを好きではありません。
ほとんどのコピー貼り付けクラスを作成せずに、各インスタンスにオブジェクト名だけを格納するラッパークラスを作成するにはどうすればよいですか?
template <int N>
class GLObject2
{
GLuint m_name;
static GLDelFunction glDelFunction;
public:
GLObject2(GLGenFunction genFunction, GLDelFunction delFunc)
{
genFunction(1, &m_name);
if (glDelFunction == nullptr)
glDelFunction = delFunc;
ASSERT(glDelFunction == delFunc);
}
GLuint getName() {return m_name;}
protected:
~GLObject2()
{
glDelFunction(1, &m_name);
}
};
template <int N>
GLDelFunction GLObject2<N>::glDelFunction = nullptr;
class GLTexture: public GLObject2<1>
{
public:
GLTexture(): GLObject2<1>(glGenTextures, glDeleteTextures) {}
};
class GLRenderBuffer: public GLObject2<2>
{
public:
GLRenderBuffer(): GLObject2<2>(glGenRenderbuffers, glDeleteRenderbuffers) {}
};
は、誰もがよりエレガントな解決策を提案することができます:私はこのような何かを行うことができ
?
IMHOのOpenGL APIは、この種の一般的なアプローチが非常にうまくいくためには、おそらく十分に統一されていません。異なる世代の機能は、異なるAPI設計手法を使用しています。 – Trillian
@Trillian:ナンセンス。 12のOpenGLオブジェクトタイプのうち、[3つしか非標準の作成/破壊メダドロジーを使用しています](http://www.opengl.org/wiki/OpenGL_Object#Nonstandard_objects)。これは他の理由では悪い考えですが、そうではありません。 –
@NicolBolas:好奇心から:このアイデアは何が悪いのですか?そして、あなたはこの悪い決定の一部に答えますか、それともあなたはそれをお勧めしますか? – Skalli