VBO - 在初始化时我该怎么办?

时间:2013-04-24 03:45:34

标签: java android opengl-es-2.0 vbo

我有一个与[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

1 个答案:

答案 0 :(得分:0)

如果您不使用扩展,则每帧都需要调用glEnableVertexAttribArray和glVertexAttribPointer。

但是,如果扩展OES_vertex_array_object可用,则可以使用Vertex Array对象将此信息与VBO数据一起存储。然后你只需要每帧调用glBindVertexArray和glDrawArrays。