我正在尝试使用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,以使索引缓冲区脱离方程式,仅用于帮助调试以查看哪个部分出错.
否则,据我所知,您的内容看起来正确.也许它之外的其他地方出了问题.