バッファオブジェクトとシェーダーを含むスプライトシート


9

シェーダーとバッファーを使用してスプライトシートを処理する「最良の」方法は何ですか?即時モードでは、描画時にスプライトのtexcoordsを変更するのは簡単ですが、最新のopenglでこれを行う方法はわかりません。すべてのtexcoordをバッファに格納し、すべてのスプライトのポインタを変更する必要がありますか、それとももっと良い方法がありますか?

回答:


11

いつでもlooongバッファの "vertex; texcoord"を繰り返すことができます。そして、あなたが言った方法のインデックスを使用してください。それはおそらく最も簡単で、あなたが知っているものに少し似ています。

メモリを節約したい場合。かなりきちんとした解決策があり、1つのスプライトをバッファに1つにまとめてtexcoordsを作成し、UV変換行列を作成してシェーダに送信し、texcoordsを(頂点シェーダで)乗算します。

あなたがそれでうまくいかなければ、あなたは自分で行列を作成する必要はありません。通常のGL関数を使用するだけで、glGetFloatv関数で行列を読み取ることができます。このような:

glGetFloatv (GL_MODELVIEW_MATRIX ,&g_TexCoordMat);

私はそれをよりよく説明するために画像を作成しました。glTranslateとglScaleは、UV空間ベースで移動しているように見えます。

スプライトシートUV

シェーダーにマトリックスを送信する方法がわからない場合は、コードを共有できます。

編集:画像を追加
(私が使用したスプライトシートのソース:funorb.com


わあ、ありがとう!完璧な答え。私はこのソリューションが本当に気に入っており、仕事から戻ったらすぐに調査します。:-)行き詰まった場合は、もう少し質問させていただきます。
アグワール'31年

これは、私の知る限り、スプライトごとに1つの描画呼び出しを生成します。よりスムーズな実装のためにこれらのスプライトをバッチ処理する方法はありますか?
uggwar

@uggwarインスタンス化された図面?
Notabene
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.