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