OpenGL ES:缓冲对象(VBO、VAO、EBO)

在这里插入图片描述
在这里插入图片描述

顶点缓冲对象(Vertex Buffer Objects,VBO)
  顶点缓冲对象VBO是在显卡存储空间中开辟出的一块内存缓存区,用于存储顶点的各类属性信息,如顶点坐标,顶点法向量,顶点颜色数据等。在渲染时,可以直接从VBO中取出顶点的各类属性数据,由于VBO在显存而不是在内存中,不需要从CPU传输数据,处理效率更高。
  
  所以可以理解为VBO就是显存中的一个存储区域,可以保持大量的顶点属性信息。并且可以开辟很多个VBO,每个VBO在OpenGL中有它的唯一标识ID,这个ID对应着具体的VBO的显存地址,通过这个ID可以对特定的VBO内的数据进行存取操作。

顶点数组对象(Vertex Arrary Object,VAO)
  VBO保存了一个模型的顶点属性信息,每次绘制模型之前需要绑定顶点的所有信息,当数据量很大时,重复这样的动作变得非常麻烦。VAO可以把这些所有的配置都存储在一个对象中,每次绘制模型时,只需要绑定这个VAO对象就可以了。
  
  VAO是一个保存了所有顶点数据属性的状态结合,它存储了顶点数据的格式以及顶点数据所需的VBO对象的引用。
  
  VAO本身并没有存储顶点的相关属性数据,这些信息是存储在VBO中的,VAO相当于是对很多个VBO的引用,把一些VBO组合在一起作为一个对象统一管理。
  
  执行VAO绑定之后其后的所有VBO配置都是这个VAO对象的一部分,可以说VBO是对顶点属性信息的绑定,VAO是对很多个VBO的绑定。

索引缓冲对象(Element Buffer Object,EBO)
  索引缓冲对象EBO相当于OpenGL中的顶点数组的概念,是为了解决同一个顶点多次重复调用的问题,可以减少内存空间浪费,提高执行效率。当需要使用重复的顶点时,通过顶点的位置索引来调用顶点,而不是对重复的顶点信息重复记录,重复调用。
  
  EBO中存储的内容就是顶点位置的索引indices,EBO跟VBO类似,也是在显存中的一块内存缓冲器,只不过EBO保存的是顶点的索引。

### 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、付费专栏及课程。

余额充值