OpenGL でレンダリング速度を上げるために VBO を実装しようとしていますが、全体的な概念は理解していますが、スプライトを使用して 2D に実装する方法がわかりません。私が見つけたすべての実装は、すべての頂点が互いに固定されている 3D モデルを描画するためのもののようです。ただし、2D ゲームでは、各スプライトに位置があり、したがって独自の MVP マトリックスがあります。
それがどのように行われるように見えるか:
Basic vertex shader:
"uniform mat4 uMVPMatrix; \n" +
"attribute vec4 vPosition;" +
"attribute vec2 texCoord;" +
"varying vec2 vTexCoord;" +
"void main() {" +
// matrix must be included as part of gl_Position
" gl_Position = uMVPMatrix * vPosition;" +
" vTexCoord = texCoord;" +
"}";
Drawing with VBOs (pseudocode)
1. Bind vertex/texture buffers
2. Load MVP matrix with glUniformMatrix4fv
3. Call glDrawArrays/glDrawElements to draw the all the vertices in one call
MVPの変更を可能にするために上記のアプローチを拡張する簡単な方法はありますか?
考えられる 2 つのアイデア:
頂点を VBO にロードしますが、各スプライトを描画し、上記のようにそれぞれの MVP マトリックスをロードします。唯一の節約は、毎回頂点データを渡す必要がないことですが、各スプライトの VBO の正しい位置にインデックスを付けるために glVertexAttribPointer を呼び出す必要があります。速度の節約は最小限になると思います。
MVP マトリックスをユニフォームとして持つ代わりに、属性として定義します。各スプライトのすべての MVP を 1 つの大きな配列に連結し、glVertexAttribPointer を使用してロードします。glVertexAttribPointer を使用して一度にマトリックスをロードすることはできないようです (最大で vec4 にロードできます)。そのため、4 回連続して呼び出して列ごとにロードする必要があります。次に、各スプライトを個別に変換できるようにする必要があります。MVP の連結にはまだ時間がかかりますが、現在の実装よりも大幅に速度が向上するはずです。
上記よりも簡単な実装はありますか?これをバッチ描画スプライトとして行う「標準的な」方法が必要だと思います。
編集
オプション 2 を使用することにしましたが、動作に問題があります:シェーダー属性 mat4 が正しくバインドされていません (Opengl ES 2.0 Android)