1

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 つのアイデア:

  1. 頂点を VBO にロードしますが、各スプライトを描画し、上記のようにそれぞれの MVP マトリックスをロードします。唯一の節約は、毎回頂点データを渡す必要がないことですが、各スプライトの VBO の正しい位置にインデックスを付けるために glVertexAttribPointer を呼び出す必要があります。速度の節約は最小限になると思います。

  2. MVP マトリックスをユニフォームとして持つ代わりに、属性として定義します。各スプライトのすべての MVP を 1 つの大きな配列に連結し、glVertexAttribPointer を使用してロードします。glVertexAttribPointer を使用して一度にマトリックスをロードすることはできないようです (最大で vec4 にロードできます)。そのため、4 回連続して呼び出して列ごとにロードする必要があります。次に、各スプライトを個別に変換できるようにする必要があります。MVP の連結にはまだ時間がかかりますが、現在の実装よりも大幅に速度が向上するはずです。

上記よりも簡単な実装はありますか?これをバッチ描画スプライトとして行う「標準的な」方法が必要だと思います。

編集

オプション 2 を使用することにしましたが、動作に問題があります:シェーダー属性 mat4 が正しくバインドされていません (Opengl ES 2.0 Android)

4

1 に答える 1

2

一般的な 2D エンジンが行うことは、ツリー ベースのレンダリングを提供することです。ノードにはモデル マトリックスがあり、親モデル マトリックスと独自のマトリックスの両方の影響を受けるいくつかの子があります。実行時に各ノードにアクセスし、親のマトリックスと独自のマトリックスを 1 つのマトリックスに連結してレンダリングします。何千ものノード (スプライト) をレンダリングする場合を除き、非常に多くの行列をドライバー メモリに渡すことによるパフォーマンスの問題について心配する必要はありません。

編集: また、ノードのモデル マトリックスによってのみ影響を受ける事前計算されたクワッドを追加する、通常はアトラスと呼ばれる特定のタイプのノードを持つこともできます ( https://github.com/cocos2d/cocos2d-iphone/blob/master-を参照)。 v2/cocos2d/CCAtlasNode.mまたはhttps://github.com/TraxNet/ShadingZen/blob/master/library/src/main/java/org/traxnet/shadingzen/core2d/QuadAtlas.java )。

于 2012-12-14T19:36:48.810 に答える