0

Android 3.2 で OpenGL ES 2.0 を使用して描画しようとしている形状があります。DrawArrays と FloatBuffer を使用すると意図したとおりにシーンをレンダリングできますが、glGenBuffers と vbo/ibo を使用するとできません。

無関係なセクションを取り除いて使用しているスニペットを次に示します

    GLES20.glGenBuffers(1, vbo, 0);
    GLES20.glGenBuffers(1, ibo, 0);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.vertexBuffer.capacity() * 4, vertexBuffer, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo[0]);
    GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * 2, indexBuffer, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

上記は、配列を作成するための私のコードです。以下は、レンダリング用の私のコードです。

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0]);
    GLES20.glEnableVertexAttribArray(positionHandle);
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo[0]);

    GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, 1, GLES20.GL_UNSIGNED_SHORT, 0);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

上記のコードを以下のコードに置き換えると、意図したとおりに動作するため、頂点フロート バッファーが正しく動作していることはわかっています。

    GLES20.glEnableVertexAttribArray(positionHandle);
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 3);

DrawArrays が機能するかどうかを確認するためにデバッグしていたときに (バインド バッファーに関連するすべてのコードを削除すると機能します)、すべての gen/bind/data バッファー呼び出しを除外して *GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER) できることがわかりました。 、vbo[0]);*、これは drawArrays を使用するときにレンダリングを排他的に防止します

私は一日中、小さな詳細を変更し、さまざまな順序で呼び出しを試みましたが、役に立ちませんでした.

最初は、次のデータで立方体をレンダリングしようとしていました: private float[] pts = { -1f, 1f, -1f,

                         1f,    1f,     -1f,
                         -1f,   1f,     1f,
                         1f,    1f,     1f,
                         -1f,   -1f,    -1f,
                         1f,    -1f,    -1f,
                         -1f,   -1f,    1f,
                         1f,    -1f,    1f };
private short indecies[] = {0,1,2,3,6,7,4,5,0,1,1,5,3,7,7,6,6,2,4,0};

しかし、私はこのテストデータを使用することにしました。これは、インデックスを使用せずに drawArrays で機能します

    private float[] pts = {     -1,0,0,
                            1f,0,0,
                            0f,1,0};
private short[] indecies = {0,1,2};
4

1 に答える 1

2

後で誰かがこれに苦労した場合に備えて、キラルコードは私の問題を置き換える方法を教えてくれました

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3*4, 0);

また、glDrawElements の対応する引数にインデックス カウントを使用します。

于 2013-07-20T11:42:37.090 に答える