OpenGL 3.0の前後のOpenGLコンテキストはかなり異なります。これまでのところ、私はどちらにしても実際にはどちらか一方のバッファでのみ作業してきましたが、最も顕著な違いはイミディエイトモードがないことです。
イミディエイトモードの考慮事項をまとめて捨てる場合、特に2Dグラフィックエンジンで低レベルの2次元操作をコーディングする場合に注意すべき重要な違いは何ですか?
OpenGL 3.0の前後のOpenGLコンテキストはかなり異なります。これまでのところ、私はどちらにしても実際にはどちらか一方のバッファでのみ作業してきましたが、最も顕著な違いはイミディエイトモードがないことです。
イミディエイトモードの考慮事項をまとめて捨てる場合、特に2Dグラフィックエンジンで低レベルの2次元操作をコーディングする場合に注意すべき重要な違いは何ですか?
回答:
具体的には、コンテキストに関してはほとんど違いがありません。ほとんどのOpenGL実装は、OpenGL拡張機能の動作方法により、レガシーコンテキストを使用している場合でも、OpenGL 3.0以降のほとんどの機能を備えています。
OpenGL 3.0のどの機能を使用する価値があるかを具体的に尋ねる場合、最良の機能のいくつかはジオメトリシェーダーとインスタンス化です。これらはどちらも特定の状況での2Dグラフィックスにも役立ちます。ただし、単純な2Dのほとんどの場合、実行するのはフレームごとにストリーミング頂点バッファーをいっぱいにして、1回の描画呼び出しを行うだけなので、追加の操作はほとんどありません。
一般にOpenGLの2Dに関しては、テクスチャアトラス(スプライトシート)があることを確認してください。テクスチャの状態を変更する必要はほとんどありません。スプライトごとに描画呼び出しを行うのは非常に効率が悪いため、避けたいと思います。むしろ、多数のスプライトをバッチ処理して、一度にすべて描画したいのです。ペインターのアルゴリズムでレンダリングします。「レンダー」とは、ジオメトリを頂点バッファーにプッシュし、最後にそれを描画することを意味します。必要に応じて後処理します。
ここで多くの情報を見つけることができます:OpenGLレジストリ。拡張機能はたくさんあります。各セクション(ARB、EXT、...)は、追加日に従って順序付けられています。新しい拡張機能は、OpenGLの新しいバージョンに対して作成されます。たとえば、ARBセクションを見ると、ARB_timer_query(含む)の下のほぼすべての拡張機能がOpenGL 3.2以降に対して作成されています。
バッファについても触れたので、拡張機能GL_NV_vertex_buffer_unified_memoryを試すことができます。いくつかの情報はここにあります(プレゼンテーションへのリンクもあります)。
また、シェーダーを使用している場合は、shader_buffer_loadも役立ちますが、仕様はまだ読んでいません。