2011-07-28 167 views
8

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

回答

12

当然,这其实很简单,你的属性有一个位置,顶点数据馈送glVertexAttribPointer为纯顶点数组,像这样:

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

对于维也纳组织,它是相同的,但你必须将缓冲区绑定到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执行绘图。希望这可以帮助!

+0

是的,这应该做我所需要的。我明天会尝试。谢谢! – Nitrex88

+0

如果我能在第二个例子中找到如何处理'vertices',它可能会帮助我。一个主意? –

+1

@Stephane顶点应该使用glBufferData上传到VBO。 –

相关问题