Android opengl es 2.0 Vertex / Index Buffer无效

时间:2013-07-20 00:15:55

标签: android opengl-es vbo vertex-buffer

我有一个形状,我试图通过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缓冲区调用EXCEPT * 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};

1 个答案:

答案 0 :(得分:1)

如果其他人后来遇到这种情况,Chiral Code告诉我如何通过替换

来解决我的问题
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);

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

还可以使用glDrawElements的相应参数的指数计数。