8

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

4

1 回答 1

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()。希望这可以帮助!

于 2011-07-29T00:57:52.610 回答