3

私はOpenGLを使用してC#でタイルベースのゲームを作成しており、コードを可能な限り最適化しようとしています。

私は本のいくつかの記事とセクションを読みましたが、VBOを使用するとパフォーマンスが大幅に向上するという同じ結論に達しました(ご存知かもしれませんが)。

ただし、それらがどのように正確に機能するかはよくわかりません。

私のゲームでは画面にタイルが表示され、一部は変更され、一部は同じままになります。これにVBOを使用するには、各タイルの座標を配列に追加する必要がありますよね?

また、これらのタイルにテクスチャを適用するには、このために別のVBOを作成する必要がありますか?

アニメーション化されたタイルと画面上で静的なタイルがある場合、これらの座標をタイリングするためのコードがどのようになるかはよくわかりません。 誰かが私にこれの簡単な要約を教えてもらえますか?

すべてのタイルのテクスチャアトラスを使用する予定です。テクスチャタイルにこのアトラスをどこから使用し始めるかわかりません。 適用するアトラスのタイルの座標を計算する必要がありますか?アトラスの座標を使用してテクスチャを適用する方法はありますか?

誰かがこれらの質問を解決することができれば、それは大いにありがたいです。必要に応じて、誰かに時間と支援を払い戻すこともできます。

ありがとう、

グレッグ

4

1 に答える 1

7

では、これをパーツに分割しましょう。使用する OpenGL のバージョンが指定されていません。GL 3.3 を想定しています。

VBO


頂点バッファー オブジェクトは、クライアント頂点配列の代替と見なされると、ほとんどの場合 GPU 帯域幅を節約します。タイル マップは実際には多くのジオメトリではありません。ただし、最近の GL バージョンでは、頂点バッファー オブジェクトが頂点を指定する唯一の方法であるため (これは非常に理にかなっています)、ここで「パフォーマンスの向上」について実際に話すことはできません。「即時モードやクライアント側配列などの非推奨の頂点指定方法と比較して」という意味であれば、はい、パフォーマンスが向上しますが、おそらくフレームあたり 10k 以上の頂点でしか感じないでしょう。

テクスチャアトラス


テクスチャ アトラスは、テクスチャの切り替えを節約するための優れた機能です。ただし、GL3 (および DX10) 対応の GPU では、より現代的で便利なアプローチが利用できるため、この手法に特有の多くの問題を回避できます。GLリファレンスドキュメントをチェックしてくださいTEXTURE_2D_ARRAY- あなたはそれを気に入るはずです。GL3 カードがターゲットの場合は、テクスチャ アトラスを忘れてください。そうでない場合は、古いカードが拡張機能としてテクスチャ配列をサポートしているグーグルを持ってください。私は詳細に精通していません。

レンダリング


では、タイル マップを効率的に描画するにはどうすればよいでしょうか。データに注目しましょう。多くのタイルがあり、各タイルには次の情報があります。

  • グリッド位置 (x,y)
  • マテリアル(「テクスチャ」ではなく「マテリアル」と呼びましょう。画像がアニメーション化され、時間とともに変化する可能性があるためです。「マテリアル」は、「時間とともに変化する1つのテクスチャまたはテクスチャのセット」または何かとして解釈されます。欲しいです)。

これが、GPU に送信する必要があるすべての「タイルごと」のデータである必要があります。各タイルをクワッドまたはトライアングル ストリップとしてレンダリングするため、次の 2 つの選択肢があります。

  • タイルごとに (x,y) の代わりに 4 つの頂点 (x,y),(x+w,y),(x+w,y+h),(x,y+h) を送信します。
  • ジオメトリ シェーダーを使用して、送信される 1 ポイントごとにテクスチャ座標とともに 4 ポイントを計算します。

お気に入りを選んでください。また、VBO に含まれるものに直接対応することに注意してください。後者のソリューションでは、VBO が 4 倍小さくなります。

マテリアルについては、シンボリック整数として渡すことができます。フラグメント シェーダーでは、現在の時間 (uniform 変数として渡される) と特定のタイルのマテリアル ID に基づいて、テクスチャ配列からテクスチャ ID を決定できます。使用する。このようにして、簡単なテクスチャ アニメーションを作成できます。

于 2010-12-08T00:49:14.253 に答える