我有一个形状,我正试图通过 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};