0
点赞
收藏
分享

微信扫一扫

OpenGL里的VBO,VAO,EBO的理解

陈情雅雅 2022-05-16 阅读 175

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

顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何 随后的顶点属性调用 都会储存在这个VAO中。说白了就是缓存glVertexAttribPointer()函数的结果。

这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。

OpenGL里的VBO,VAO,EBO的理解_数组


索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)

EBO也是一个缓冲,它专门储存索引,OpenGL调用这些顶点的索引来决定该绘制哪个顶点。

OpenGL里的VBO,VAO,EBO的理解_数据_02


下面记录一下glVertexAttribPointer 函数的图解。

glVertexAttribPointer(index,size,type,normalized,stride,pointer);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

  • 第一个参数指定我们要配置的顶点属性。对应​​layout(location = 0)​​​定义了position顶点属性的位置值(Location)。它可以把顶点属性的位置值设置为​​0​​​。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入​​0​​。
  • 第二个参数指定顶点属性的大小。顶点属性是一个​​vec3​​,它由3个值组成,所以大小是3。
  • 第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中​​vec*​​都是由浮点数值组成的)。
  • 第四个参数定义我们是否希望数据被标准化(Normalize)。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE。
  • 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性组之间的间隔(多少字节数)。由于下个组位置数据在3个​​float​​​之后,我们把步长设置为​​3 * sizeof(float)​​。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。一旦我们有更多的顶点属性,我们就必须更小心地定义每个顶点属性之间的间隔。
  • 最后一个参数的类型是​​void*​​,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头,所以这里是0。

OpenGL里的VBO,VAO,EBO的理解_数据_03





举报

相关推荐

0 条评论