13

OpenGL 標準ページには、OpenGL はC および C++ から呼び出すことができると記載されています。ただし、API はもちろんピュア C です。OpenGL はたとえば多くの列挙型を使用するため、列挙型クラス (C++11 から) を使用すると、エラーの数が大幅に減少し、API が初心者にとってより使いやすくなります。OpenTK (C# 用) のような多くのバインディングが作成されていることがわかります。優れた C++ API を作成することはそれほど難しくありません。

あいまいなラッパー以上のものを見つけることができなかったので、私の質問は次のとおりです。

  1. OpenGL 用の C++11 機能を使用する有名な C++ ラッパーはありますか? そうでない場合は、
  2. このようなことは、有名な誰か (特にクロノスを意味します) によって計画されていますか?
4

3 に答える 3

11

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コンテキスト管理は、質問のプログラムに大きく依存しているため、そのプログラムに合わせて特別に調整する必要があります。

于 2012-08-23T12:37:25.040 に答える
6

OpenGL のラッピングと OpenGLオブジェクト モデルは、2 つの異なる概念です。OpenGL エンティティは、その機能をラップするオブジェクトに簡単に作成できます。実際、OpenGL または D3D のいずれかでインスタンス化できるレンダラーを作成する場合、これは絶対に必要です。

私はこのようなクラスを持っています:

    class Device
        class State
    class Buffer
            class BufferUniform
        class BufferVertices
        class BufferIndices
        class BufferArray
    class Texture
        class Texture1d
        class Texture2d
        class Texture3d
        class TextureCubeMap
        class TextureArray
        class TextureRender
        class TextureFrame          
    class Shader
        class ShaderPixel
        class ShaderVertex
        class ShaderGeometry
        class ShaderEvaluator
        class ShaderTessellator
        class ShaderProgram
        class ShaderGenerator
            class ShaderGeneratorParser
            class ShaderGeneratorNode
            class ShaderGeneratorCondition

...そして、それぞれの D3D または OpenGL バージョンのいずれかです。Renderer<...> は、D3D と OpenGL のどちらで処理するかに応じて、コンパイル時にいずれかのセットでインスタンス化されます。

于 2012-08-23T13:38:14.547 に答える