0

[x、y、z、textureX、textureY、.....] でインターリーブされた VBO があり、すべてほとんど機能して表示されています。初期化して忘れたときに何ができるかを理解しようとしています。

これが私が現在初期化で試みていることです。

EDITED: バッファのバインド解除を修正し、一部のコードを移動しました。

        mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "vPosition");
        mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture");
        mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate");

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glBufferObjects.get(0));
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, interleavedBuffer.capacity() * BYTES_PER_FLOAT, interleavedBuffer, GLES20.GL_STATIC_DRAW);          

        //////////These are superfluous but I'd like to do them once since they never change///// 
        GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
        GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false,
                INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT);

        GLES20.glEnableVertexAttribArray(mPositionHandle);
        GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
                INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0);
        ////////////////////////////////////////////////////

        mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix");

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, glBufferObjects.get(1));
        GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER,
                drawListBuffer.capacity() * BYTES_PER_SHORT,
                drawListBuffer,
                GLES20.GL_STATIC_DRAW);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);     

これが機能するものです。私はたくさんいじりましたが、ドローフレームごとに何が必要なのか、それが必要なのか、間違っているのかわかりません。どんな助けでも大歓迎です。

public void draw(float[] mvpMatrix) {
    GLES20.glUseProgram(mProgramHandle);
    GLES20.glUniform1i(mTextureUniformHandle, 0);

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glBufferObjects.get(0));
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, glBufferObjects.get(1));        

    GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false,
            INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT);


    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
            INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0);

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, 0);

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

編集: 更新 - 削除すると

    GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle);
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false,
            INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT);


    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
            INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0);

私の draw() から gl_draw_error_checks:418: GL_INVALID_OPERATION をスローします

4

1 に答える 1

0

拡張機能を使用していない場合は、glEnableVertexAttribArray と glVertexAttribPointer の呼び出しがフレームごとに必要になります。

ただし、拡張 OES_vertex_array_object が使用可能な場合は、Vertex Array オブジェクトを使用して、この情報を VBO データと共に格納できます。次に、フレームごとに glBindVertexArray と glDrawArrays を呼び出すだけです。

于 2013-04-29T16:35:44.377 に答える