11

基本的な「最新の」OpenGLの概念を学習する方法として、タイルベースの2Dゲームを作成しています。私はOpenGL2.1でシェーダーを使用しており、レンダリングパイプラインと、実際に画面上にジオメトリを描画する方法に精通しています。私が疑問に思っているのは、タイルマップを整理してすばやく効率的にレンダリングするための最良の方法です。私はいくつかの潜在的な方法を考えました:

1.)単一のタイル(頂点とテクスチャ座標)を表すクワッドをVBOに格納し、各タイルを個別のdraw*呼び出しでレンダリングし、画面上の正しい位置に変換し、uniform2iその特定のタイルのテクスチャアトラス内の位置を指定するために使用します。

2.)すべてのタイルを含むVBOを画面上に保持し(計算済みの画面座標とテクスチャアトラス座標)、BufferSubDataフレームごとにタイルを更新するために使用しますが、1回のdraw*呼び出しを使用します。

3.)タイルの静的なNxN「チャンク」を含むVBOを保持しますが、タイルの多くのチャンクを少なくとも部分的に画面に表示し、それぞれを所定の位置に変換します。

* 64x64のチャンクのレンダリングがそれほど非効率的でない限り、可能であれば最後のオプションを避けたいと思います。タイルはそのサイズのブロックでメモリに読み込まれ、一度に画面に表示されるのは約20x40のタイルだけですが、一度に最大4つのチャンクをレンダリングする必要があります。このメソッドは、他のいくつかの方法でもコードを複雑にします。

では、タイルの画面をレンダリングする最も効率的な方法はどれですか?より良い方法はありますか?

4

2 に答える 2

9

これらのいずれかを行うことができ、おそらく問題ありません。あなたがレンダリングしようとしていることは非常に単純です。

1 番目の方法は、1 回の描画呼び出しで GPU に大量のバッチ作業を行わせるのではなく、非常に単純な「モデル」を多数描画することになるため、原則として他のオプションよりも明らかに劣ります。ただし、一度に画面に表示されるタイルが 20×40 = 800 個しかない場合、これは最新の CPU および GPU にとって取るに足らない量の作業です (クレイジーなフラグメント シェーダーを実行している場合を除きます)。

ゲームの作業を続行できるように、プログラムが最も簡単な方を使用することをお勧めします。これが1位か2位だと思います。パフォーマンスの問題が発生した場合は、#2 または #3 (64×64 は細かいチャンク サイズのように聞こえます) のいずれかを実行すると、プログラムの描画部分 (つまり、バッファーの更新) に費やす CPU 時間を最小限に抑えることができます。 (s))。

于 2012-07-29T05:38:42.847 に答える
0

私は最近、Android の OpenGL ES 2.0 を通じて、最新の OpenGL を自分で学習しています。OpenGL ES 2.0 プログラミング ガイドでは、「構造体の配列」を推奨しています。つまり、

「頂点属性をまとめて単一のバッファに格納します。構造体は頂点のすべての属性を表し、頂点ごとにこれらの属性の配列を持っています。」

これは最初は多くのスペースを消費するように見えるかもしれませんが、VBO を使用した効率的なレンダリングと、各タイルのテクスチャ マッピングの柔軟性が可能になります。私は最近、Droid 2 の 20x20 タイル 16 進グリッドの頂点、法線、色、およびテクスチャ データを含むインターリーブ配列を使用して、タイル化された 16 進グリッドを作成しました。これまでのところ、スムーズに動作しています。

于 2012-07-29T19:08:40.587 に答える