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

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


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

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

对于VBOs来说,情况是一样的,但是必须将缓冲区绑定到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执行绘图。 希望这可以帮助!

链接地址: http://www.djcxy.com/p/52421.html

上一篇: OpenGL ES 2.0 and vertex buffer objects (VBO)

下一篇: Explicit vs Automatic attribute location binding for OpenGL shaders