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

我正在尝试使用OpenGL ES 2.0在Android(API 10)上创建一个简单的测试程序以绘制一个简单的矩形.我可以将其与直接引用顶点的浮点缓冲区一起使用,但是我更愿意使用VBO / 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)对于opengl程序,“正常编译和运行”是无用的指标.通过主动调用glGetError并使用glGet(Shader | Program)iv检查着色器的编译和链接状态来报告错误.您是否在任何地方检查错误?

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

3)您正在绑定verts缓冲区onDraw,但我没有看到有关索引缓冲区的任何信息.总是这样吗?

4)您也可以尝试使用glDrawArrays绘制VBO,以使索引缓冲区脱离方程式,仅用于帮助调试以查看哪个部分出错.

否则,据我所知,您的内容看起来正确.也许它之外的其他地方出了问题.

上一篇:java-缓冲VBO数据的小延迟


下一篇:【BZOJ2732】【HNOI2012】射箭 二分+半平面交