2

こんにちは、これが私の最初の投稿です:) Android 2.3 OpenGL ES 2 2Dゲームエンジンに取り組んでいます。スプライトを 1 つずつ描画するのではなく、1 つの大きな VBO を作成することでパフォーマンスを向上させようとしています。バッチ処理を使用して、一度に 32 個のスプライトを描画します。

これは私の頂点シェーダーの定義です:

uniform mat4 mvpMatrix[32];

クライアント側メモリを使用する場合

for (int k = 0; k < m; k++)
    mvpBuffor.put(models[k], 0, models[k].length);
mvpBuffor.position(0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, m, false, mvpBuffor);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, m * VERTEX_PER_SPRITE);

これは非常にうまく機能しますが、VBOを使用しようとすると

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, batch.mvpBufferIndex);
GLES20.glEnableVertexAttribArray(mMVPMatrixHandle);
GLES20.glVertexAttribPointer(mMVPMatrixHandle, MVP_SIZE * BATCHSIZE, GLES20.GL_FLOAT, false, 0, 0);

エラーコード 1281 が表示されます

mat4ユニフォームの配列を頂点シェーダーに渡す方法を知っている人はいますか?

4

3 に答える 3

0

このページを読むと、次のようになります。

GLES20.glUniformMatrix4fv(<handle>, <number of matrices>, <transposed?>, <array of matrices>);
于 2012-12-04T21:49:35.947 に答える
0

シェーダーがまだ mvpMatrix を均一として宣言しているように見えます

均一な mat4 mvpMatrix[32];

それでも、それを属性として渡そうとしています:

GLES20.glEnableVertexAttribArray(mMVPMatrixHandle); GLES20.glVertexAttribPointer(mMVPMatrixHandle, MVP_SIZE * BATCHSIZE, GLES20.GL_FLOAT, false, 0, 0);

于 2017-04-30T07:33:44.083 に答える
0

なんらかの理由でモバイルの GLES で一様配列が壊れている https://www.opengl.org/discussion_boards/showthread.php/176674-Uniform-arrays-in-OpenGLES

于 2017-11-29T17:33:55.703 に答える