OpenGL里的VBO,VAO,EBO的理解

本文介绍了顶点缓冲对象(VBO)、顶点数组对象(VAO)和索引缓冲对象(EBO)的基本概念及作用,并详细解释了如何使用glVertexAttribPointer函数配置顶点属性。

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

顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何 随后的顶点属性调用 都会储存在这个VAO中。说白了就是缓存glVertexAttribPointer()函数的结果。
这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。

 

索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)
EBO也是一个缓冲,它专门储存索引,OpenGL调用这些顶点的索引来决定该绘制哪个顶点。

 

下面记录一下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。

 

转载于:https://www.cnblogs.com/yongfengnice/p/8665426.html

### Android 平台上 OpenGLVBOEBOVAO 的用法 #### 一、VBO (Vertex Buffer Object) VBO 是用于存储大量顶点数据的对象。通过将顶点数据上传至 GPU 显存中,可以显著提高渲染效率。 ```java // 创建并绑定一个VBO int vbo; vbo = GLES20.glGenBuffers(); GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo); FloatBuffer vertexBuffer = ... // 初始化顶点缓冲区 GLES20.glBufferData( GLES20.GL_ARRAY_BUFFER, vertexBuffer.capacity() * Float.BYTES, vertexBuffer, GLES20.GL_STATIC_DRAW ); ``` 此代码片段展示了如何创建和初始化一个 VBO 来保存顶点坐标[^1]。 #### 二、EBO (Element Buffer Object 或 Index Buffer) EBO 存储的是索引列表,用来定义哪些顶点应该被连接起来形成几何图形。这有助于减少重复顶点的数量,从而节省内存空间并加快绘制速度。 ```java // 创建并填充EBO int ebo; ebo = GLES20.glGenBuffers(); GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ebo); ShortBuffer indexBuffer = ... // 初始化索引缓冲区 GLES20.glBufferData( GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * Short.BYTES, indexBuffer, GLES20.GL_STATIC_DRAW ); ``` 上述代码说明了怎样构建 EBO 及其关联的数据结构。 #### 三、VAO (Vertex Array Object) VAO 负责管理多个 VBOs 和它们之间的配置关系。它记录了每个属性指针的位置以及相应的格式信息,使得切换不同类型的顶点布局变得简单快捷。 ```java // 设置VAO状态 int vao; vao = GLES20.glGenVertexArrays(); GLES20.glBindVertexArray(vao); // 配置顶点属性指针 GLES20.glEnableVertexAttribArray(0); // 启用第一个属性列 GLES20.glVertexAttribPointer( 0, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, offset ); // 解绑当前VAO GLES20.glBindVertexArray(0); ``` 这段程序描述了如何建立一个新的 VAO 实例,并对其进行必要的参数设定[^3]。 当准备实际绘图时: ```java // 绑定先前设置好的VAO GLES20.glBindVertexArray(vao); // 执行绘制命令 if(ebo != null){ GLES20.glDrawElements(primitiveType, count, type, indicesOffset); }else{ GLES20.glDrawArrays(primitiveType, firstIndex, count); } // 清理工作 GLES20.glBindVertexArray(0); ``` 以上就是针对 Android 设备上使用 OpenGL ES 进行三维图形编程时涉及到的三个重要概念及其具体实现方法[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值