OpenGL ES 2.0和顶点缓冲对象(VBO)

时间:2011-07-28 05:02:33

标签: iphone opengl-es-2.0 shader vbo vertex-buffer

我无法弄清楚如何在opengl es 2.0 for iphone中为我的地形使用顶点缓冲对象。这是静态数据所以我希望通过使用VBO来提高速度。在常规OpenGL中,我使用显示列表和着色器没问题。但是,在opengl es 2.0中,我必须将顶点数据作为属性发送到着色器,并且不知道它如何与VBO一起工作。顶点缓冲区如何知道它在调用时将顶点数据绑定到哪个属性?这在opengl es 2.0中是否可行?如果没有,还有其他方法可以优化我的地形渲染是静态的吗?

1 个答案:

答案 0 :(得分:12)

当然,实际上这很简单,你的属性有一个位置,顶点数据用glVertexAttribPointer提供普通的顶点数组,如下所示:

float *vertices = ...;
int loc = glGetAttribLocation(program, "position");
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, vertices);

对于VBO,它是相同的,但你必须将缓冲区绑定到GL_ARRAY_BUFFER目标,而glVertexAttribPointer的最后一个参数现在是缓冲区内存存储器的偏移量。指针值本身被解释为偏移量:

glBindBuffer(GL_ARRAY_BUFFER, buffer);
int loc = glGetAttribLocation(program, "position");
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0);

在这种情况下,偏移量为0,假设顶点数据是在缓冲区的开头上传的。偏移量是以字节为单位的度量。

然后使用glDrawArrays / glDrawElements执行绘图。希望这有帮助!