Android OpenGL ES 2.0 VBO 不渲染

Android OpenGL ES 2. 0 VBO Not Rendering

我正在尝试获取一个简单的纹理四边形以渲染为 VBO。当不使用 VBO 时,一切都按预期工作(但是,对于静态对象,我仍在每一帧更新我的顶点数据,这似乎毫无意义,因此切换到 VBO)。

但是,我一定是做错了什么,因为我什么都没有呈现到屏幕上。

这是我的相关代码:

构造函数:

public VBO() {

        updateVertexData();

        vertexBuf = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();

        vertexBuf.put(vertices);

        vertexBuf.position(0);

        //Create buffers array for VBO (I'm using interleaved data so only 1 needed here??
        final int buffers[] = new int[1];

        GLES20.glGenBuffers(1, buffers, 0);

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);

        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuf.capacity() * 4, vertexBuf, GLES20.GL_STATIC_DRAW);

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

        mBufferIdx = buffers[0];

        vertexBuf.limit(0);
        vertexBuf = null;
    }

顶点更新

public void updateVertexData(){

    vertices[0]=-1;
    vertices[1]=1f;
    vertices[2]=0;
    vertices[3]=0;
    vertices[4]=0;

    vertices[5]=1;
    vertices[6]=1f;
    vertices[7]=0;
    vertices[8]=1;
    vertices[9]=0;

    vertices[10]=-1;
    vertices[11]=-1f;
    vertices[12]=0;
    vertices[13]=0;
    vertices[14]=1;

    vertices[15]=1;
    vertices[16]=-1f;
    vertices[17]=0;
    vertices[18]=1;
    vertices[19]=1;
}

渲染

public void drawVBO(){

    GLES20.glUseProgram(iProgId);

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

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);

    GLES20.glEnableVertexAttribArray(iPosition);

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

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);

    GLES20.glEnableVertexAttribArray(iTexCoords);

    GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

}   

就像我说的,如果我去掉 VBO 代码并将代码从 updateVertexData 移回我的绘制方法,那么一切正常。如果有人能解释我在这里做错了什么,我将不胜感激....

问题是第 2 个“glVertexAttribPointer”行的偏移量。

原文

GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);

'offset' 参数(末尾的“3”)错误。 3 是位置数据(x、y 和 z)的大小,需要乘以 4(每个浮点数的字节数)。所以...

正确的代码

//For readability
final int POSITION_SIZE = 3;
final int BYTES_PER_FLOAT = 4;
final int TEXTURE_SIZE = 2;
final int STRIDE = (POSITION_SIZE+TEXTURE_SIZE)*BYTES_PER_FLOAT   

//Correct line
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, STRIDE, (POSITION_SIZE*BYTES_PER_FLOAT));