2012-03-21 108 views
3

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

下面是一些代码块,以帮助解释我现在如何设置它。 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); 
+0

列出任何书籍或简单的教程将非常有帮助。 – Derek 2012-03-21 20:20:30

回答

3

我看不出有什么立即错的,但这里的一些想法,你可以触摸上。

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

2)您不应该假设0是顶点的正确索引。它现在可能会工作,但如果您更改着色器,稍后可能会中断。使用glGetAttribLocation获取正确的索引。 3)你绑定了垂直缓冲区onDraw,但是我没有看到关于索引缓冲区的任何信息。这是否总是有约束力?

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

否则你看起来是正确的,只要我可以在这个小片段中看出来。也许外面的其他东西出问题了。

+0

1.我刚刚开始,所以我还没有纳入任何opengl错误检查。只是从目前为止我看过的教程构建而成。但我会记住这一点。 2.我有一个处理我的vPosition(顶点着色器),我一直在这些领域中交替使用。再一次,这是我从别人那里得到的代码,我不确定是否正确。 3.它应该始终与onSurfaceChanged绑定,但我是新的,因此可能不正确。 4.我只是用glDrawArray尝试过它,它工作(但只绘制了一个三角形,因为我只有4个顶点定义)。 – Derek 2012-03-21 19:21:11

+1

@Derek我只注意到glDrawElements的规范:“type:指定索引中值的类型,必须是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT或GL_UNSIGNED_INT之一。”看起来GL_INT是该函数的非法参数。如果你有错误检查你会抓到这个:) – Tim 2012-03-21 20:23:31

+0

是的,我只是看到了我自己,并改变了它。这解决了我的问题。感谢您的帮助Tim – Derek 2012-03-21 20:55:22