基本的な「最新の」OpenGLの概念を学習する方法として、タイルベースの2Dゲームを作成しています。私はOpenGL2.1でシェーダーを使用しており、レンダリングパイプラインと、実際に画面上にジオメトリを描画する方法に精通しています。私が疑問に思っているのは、タイルマップを整理してすばやく効率的にレンダリングするための最良の方法です。私はいくつかの潜在的な方法を考えました:
1.)単一のタイル(頂点とテクスチャ座標)を表すクワッドをVBOに格納し、各タイルを個別のdraw*
呼び出しでレンダリングし、画面上の正しい位置に変換し、uniform2i
その特定のタイルのテクスチャアトラス内の位置を指定するために使用します。
2.)すべてのタイルを含むVBOを画面上に保持し(計算済みの画面座標とテクスチャアトラス座標)、BufferSubData
フレームごとにタイルを更新するために使用しますが、1回のdraw*
呼び出しを使用します。
3.)タイルの静的なNxN「チャンク」を含むVBOを保持しますが、タイルの多くのチャンクを少なくとも部分的に画面に表示し、それぞれを所定の位置に変換します。
* 64x64のチャンクのレンダリングがそれほど非効率的でない限り、可能であれば最後のオプションを避けたいと思います。タイルはそのサイズのブロックでメモリに読み込まれ、一度に画面に表示されるのは約20x40のタイルだけですが、一度に最大4つのチャンクをレンダリングする必要があります。このメソッドは、他のいくつかの方法でもコードを複雑にします。
では、タイルの画面をレンダリングする最も効率的な方法はどれですか?より良い方法はありますか?