OpenGLには、すでにいくつかの「オブジェクト」の概念があります。
たとえば、IDを持つものはすべてオブジェクトとして通過できます(具体的には「オブジェクト」という名前のものもあります)。バッファ、テクスチャ、頂点バッファオブジェクト、頂点配列オブジェクト、フレームバッファオブジェクトなど。少しの作業で、クラスをクラスでラップできます。また、コンテキストが拡張機能をサポートしていない場合、古い非推奨のOpenGL関数にフォールバックする簡単な方法を提供します。たとえば、VertexBufferObjectはglBegin()、glVertex3f()などの使用にフォールバックできます。
従来のOpenGLの概念から離れるには、いくつかの方法があります。たとえば、バッファに関するメタデータをバッファオブジェクトに保存する場合などです。たとえば、バッファに頂点が格納されている場合。頂点の形式は何ですか(つまり、位置、法線、Texcoordsなど)。使用するプリミティブ(GL_TRIANGLES、GL_TRIANGLESTRIPなど)、サイズ情報(格納される浮動小数点数、それらが表す三角形の数など)。それらを配列の描画コマンドに簡単にプラグインできるようにするためです。
OGLplusをご覧になることをお勧めします。OpenGL用のC ++バインディングです。
またglxx、これは拡張機能のロード専用です。
OpenGL APIのラッピングに加えて、その上に少し高いレベルの1つのビルドを作成することを検討する必要があります。
たとえば、すべてのシェーダーを担当し、それらをロードして使用するマテリアルマネージャークラス。また、プロパティをそれらに転送する責任があります。そうすれば、次のように呼び出すことができます。materials.usePhong(); material.setTexture(sometexture); material.setColor()。これにより、共有ユニフォームバッファーオブジェクトなどの新しいものを使用して、シェーダーが1ブロックで使用するすべてのプロパティを含む1つの大きなバッファーを使用できますが、サポートされていない場合は、各シェーダープログラムへのアップロードにフォールバックできるため、柔軟性が向上します。1つの大きなモノリシックシェーダーを使用し、サポートされている場合は均一なルーチンを使用して異なるシェーダーモデル間で交換できます。また、多数の異なる小さなシェーダーを使用することもできます。
シェーダーコードを記述するためのGLSL仕様からの支出も確認できます。たとえば、#includeは非常に便利で、シェーダーの読み込みコードに非常に簡単に実装できます(ARB拡張機能もあります)。また、サポートされている拡張機能に基づいてコードをオンザフライで生成することもできます。たとえば、共有ユニフォームオブジェクトを使用するか、通常のユニフォームを使用するようにフォールバックします。
最後に、シーングラフ、特殊効果(ぼかし、グロー)などの処理、シャドウ、ライティングなどの複数のレンダリングパスを必要とする処理を行う、高レベルのレンダリングパイプラインAPIが必要になります。それに加えて、グラフィックスAPIとは関係なく、世界のオブジェクトのみを扱うゲームAPIです。