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

Nit*_*x88 8 iphone shader vbo vertex-buffer opengl-es-2.0

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

Mat*_*gro 12

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

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

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

glBindBuffer(GL_ARRAY_BUFFER, buffer);
int loc = glGetAttribLocation(program, "position");
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 0, 0);
Run Code Online (Sandbox Code Playgroud)

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

然后使用glDrawArrays/glDrawElements执行绘图.希望这可以帮助!

  • @Stephane 顶点应该使用 glBufferData 上传到 VBO。 (2认同)