初识OpenGL VBO顶点缓冲对象

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识OpenGL VBO顶点缓冲对象相关的知识,希望对你有一定的参考价值。

1. 顶点缓冲VBO(Vertex Buffer Objects)

会在GPU内存(通常被称为显存)中储存大量顶点。用来管理这个内存,它使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。

step1. 使用glGenBuffers函数和一个缓冲ID生成一个VBO对象

unsigned int VBO;
glGenBuffers(1, &VBO);

OpenGL有很多缓冲对象类型,顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER。

step2. 使用glBindBuffer函数把新创建的缓冲绑定到GL_ARRAY_BUFFER目标上

glBindBuffer(GL_ARRAY_BUFFER, VBO);  

从这一刻起,我们使用的任何(在GL_ARRAY_BUFFER目标上的)缓冲调用都会用来配置当前绑定的缓冲(VBO)。

step3. 可以调用glBufferData函数把之前定义的顶点数据复制到缓冲的内存中:

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数。
参数一:目标缓冲的类型,顶点缓冲对象当前绑定到GL_ARRAY_BUFFER目标上。
参数二:指定传输数据的大小(以字节为单位);用一个简单的sizeof计算出顶点数据大小就行。
参数三:发送的实际数据。
参数四:指定了我们希望显卡如何管理给定的数据。它有三种形式:

GL_STATIC_DRAW :数据不会或几乎不会改变。
GL_DYNAMIC_DRAW:数据会被改变很多。
GL_STREAM_DRAW :数据每次绘制时都会改变。
三角形的位置数据不会改变,每次渲染调用时都保持原样,所以它的使用类型最好是GL_STATIC_DRAW。eg. 说一个缓冲中的数据将频繁被改变,那么使用的类型就是GL_DYNAMIC_DRAW或GL_STREAM_DRAW,这样就能确保显卡把数据放在能够高速写入的内存部分。

现在我们已经把顶点数据储存在显卡的内存中,用VBO这个顶点缓冲对象管理。

以上是关于初识OpenGL VBO顶点缓冲对象的主要内容,如果未能解决你的问题,请参考以下文章

iPhone Cheetah 3D OpenGL ES 顶点缓冲对象 (VBO) 示例

OpenGL顶点数组对象不记录VBO和IBO绑定

OpenGL:尝试使用 VBO(顶点缓冲区对象)绘制线条,它不显示

OpenGL 顶点缓冲

顶点缓冲区对象(删除进程)opengl

我的OpenGL学习进阶之旅介绍一下 映射缓冲区对象和复制缓冲区对象