Opengl的VAO个人理解

使用Opengl也有一段时间了,但是对于VAO,Vertex Array Object 一直是有点模糊的概念,今天又重新梳理了一下,看了些博客和官方文档。理解又加深了一点,现在记录如下:

几个关键概念:

1,VAO : Vertex Array Object

2,VBO : Vertex Buffer Object

几个关键函数:

1,glBindVertexArray

2,glBindBuffer(GL_ARRAY_BUFFER,vbo);

3,glEnableVertexAttribArray(no)

4,glVertexAttribPointer

经过我的梳理,把以上步骤用简单通俗的语言翻译出来。

1)首先,VAO是什么?顶点数组对象,其实可以看成一个数组,数组中每个元素是顶点属性。

顶点属性是什么?个人理解,顶点属性其实就是顶点的格式信息。

2)VBO是么?顶点数组对象,其实就是顶点的数组,数组中每个元素就是顶点本身。

3)glBindVertexArray的意思是?

很好理解,其实就是表示我们要配置哪个VAO,VAO可以有多个,我们绑定到哪个就是要配置哪一个。

4) glBindBuffer(GL_ARRAY_BUFFER,vbo)的意思是?

根据opengl官方文档的解读,这句话的意思可以理解为,把vbo这个句柄赋值给由opengl的当前Context中的GL ARRAY BUFFER标记的全局变量GlobalVariable

个人理解,Opengl是个状态机,Context就表示这个状态机,状态机里有一些全局变量,这个GL ARRAY BUFFER就表示一个全局变量,因此上句话的意思就是

把vbo赋值给该全局变量

5)glEnableVertexAttribArray(no)

这句话的意思结合官网可以这样理解,no是一个数字,比如6,这个数字就表示某个顶点属性,或者表示其编号,因为VAO可以看成一个数组,这个数字也可以看成这个数组的索引,它对应的应该是glsl中的layout (location = 6) 这段代码。

我们可以认为VAO这个数组中的每个元素都有两个状态,enabled和disabled,默认都是disabled,此时 VertexShader去读取对应的值时,读到的将是一个默认值(而不是数组中的值)

glEnableVertexAttribArray的作用就是将该状态置为enabled,此时着色器读取值才能生效

6)glVertexAttribPointer 我们可以看到这个参数基本上是顶点格式信息,同时第一个参数是一个索引,这个索引和5)中的索引应该是同一个意思,

表示这个顶点格式信息(顶点属性)要存放在VAO的哪个元素中

举例来说glVertexAttribPointer(6,....)的意思就是 把这些顶点属性存储到 当前绑定的vao的第6个元素中,

但是还有个问题,就是vao怎么知道这个属性是对哪一个vbo呢?根据官方文档,glVertexAttribPointer会去读取之前glBindBuffer设置的那个全局变量(vbo句柄),然后把这个句柄和这些属性 打包 到一起 存到 对应的 vao元素中(这里是6号元素)

综上,当以上配置完毕,VAO中就存储了顶点着色所需要的所有信息,

也就是,某个属性 对应的顶点数组 和 格式。

最后总结一下:

一个VAO是一个数组,数组中的每个元素 存着3个东西:

1,vbo句柄 2, 该句柄对应的格式信息3,isEnabled

以上4个函数,其实就是配置这些信息,1对应glBindBuffer,2对应glVertexAttribPointer

3,对应glEnableVertexAttribArray

这样理解起来,就非常清楚了。

至此,我们就完成了VAO一个相对精确的解读方式,如果读者有更深刻的理解或者发现笔者有理解不到位的地方,欢迎指正,谢谢!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenGLVAO(Vertex Array Object)是一种管理顶点数据的对象。它允许我们在渲染过程中定义和绑定顶点属性,从而简化了顶点数据的设置和使用。 使用VAO,我们可以将多个顶点属性(如位置、颜色、法线等)绑定到一个VAO对象中。当我们需要渲染一个物体时,只需绑定对应的VAO,然后使用它所包含的顶点属性进行渲染,这样可以节省大量的重复代码。 在OpenGL中,使用以下步骤来创建和使用VAO: 1. 生成VAO对象:使用glGenVertexArrays函数生成一个VAO对象的ID,例如: ```cpp GLuint vao; glGenVertexArrays(1, &vao); ``` 2. 绑定VAO对象:使用glBindVertexArray函数将VAO对象绑定到当前上下文中,例如: ```cpp glBindVertexArray(vao); ``` 3. 设置顶点属性:使用glVertexAttribPointer函数定义顶点属性的格式和位置,例如: ```cpp // 设置顶点位置属性 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); glEnableVertexAttribArray(0); // 设置顶点颜色属性 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color)); glEnableVertexAttribArray(1); // 设置其他顶点属性... ``` 4. 解绑VAO对象:使用glBindVertexArray函数将VAO对象解绑,例如: ```cpp glBindVertexArray(0); ``` 之后,要渲染使用了VAO的物体,只需简单地绑定对应的VAO对象,然后调用渲染函数即可。 需要注意的是,VAO只保存了对应的顶点属性设置信息,并不保存实际的顶点数据。实际的顶点数据可以保存在一个缓冲区对象(如VBO)中,并通过其他方式与VAO关联。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值