在Android上的OpenGL ES 2.0中使用VBO / IBO

时间:2012-03-21 18:21:18

标签: android opengl-es vbo

我正在尝试使用OpenGL ES 2.0在android(API 10)上创建一个简单的测试程序来绘制一个简单的矩形。我可以使用浮动缓冲区直接引用顶点,但我宁愿用VBOs / IBO来做。我已经找了无数个小时试图找到一个简单的解释(教程),但还没有遇到过。我的代码编译并运行得很好,但除了清晰的颜色外,屏幕上没有任何东西出现。

以下是一些代码块,可帮助解释我现在如何设置它。

onSurfaceChanged()的一部分:

int[] buffers = new int[2];
GLES20.glGenBuffers(2, buffers, 0);
rectVerts = buffers[0];
rectInds = buffers[1];
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, rectVerts);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, (rectBuffer.limit()*4), rectBuffer, GLES20.GL_STATIC_DRAW);

GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, rectInds);
GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, (rectIndices.limit()*4), rectIndices, GLES20.GL_STATIC_DRAW);

onDrawFrame()的一部分:

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, rectVerts);
GLES20.glEnableVertexAttribArray(0);
GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, rectInds);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_INT, 0);

1 个答案:

答案 0 :(得分:3)

我没有看到任何错误,但这里有一些你可以触及的想法。

1)'编译并运行良好'对于opengl程序来说是一个无用的度量。通过主动调用glGetError并使用glGet(Shader | Program)iv检查着色器的编译和链接状态来报告错误。你在任何地方检查错误吗?

2)你不应该假设0是顶点的正确索引。它可能现在可以正常工作,但如果您更改着色器,可能会稍后破坏。使用glGetAttribLocation获取正确的索引。

3)你正在绑定顶点缓冲区onDraw,但我没有看到有关索引缓冲区的任何信息。这总是受约束吗?

4)您也可以尝试使用glDrawArrays绘制VBO以获取索引缓冲区,只是为了帮助调试以查看哪个部分是错误的。

否则你所看到的内容在我的小片段中看起来是正确的。也许除了它之外的其他东西是错的。