【图像】【OpenGL】VAO和VBO的关系
目录
- 一、VBO的作用
- 二、VAO的作用
- 三、一个VAO和多个VBO
注: VAO和VBO都是用来存储顶点信息的,并把这些信息送入顶点着色器。至于什么是顶点和顶点着色器,这里就不多说了,不了解的读者可自行CSDN。
VBO的B为Buffer之意,用来存储顶点数据;VAO的A为Array,但我认为理解为 Attribute(属性) 之意更好,意思是 Buffer(VBO)的属性。
即,我们用VBO来存储数据,而用VAO来告诉计算机这些数据分别有什么属性、起什么作用。
一、VBO的作用
VBO是 CPU 和 GPU 之间传递信息的桥梁,我们把数据存入VBO(这一步在CPU执行),然后VBO会自动把数据送入GPU。
送入GPU这一步,不需任何人为操作,用户只负责往VBO中存入数据就可以了。如下:
但是,对GPU来说,VBO中存的就只是一堆数字而已,要怎么解释它们呢?这就要用到VAO了。
二、VAO的作用
VBO是为了向GPU传递顶点数据,那么VAO就是为了向GPU解释顶点数据。有的读者会奇怪,顶点数据无非是一个个三维坐标,三个为一组,传就传了,为什么还需要解释呢?那么我们来看下面这个VBO中的数据:
float buffer = {//顶点坐标(3个一组) //顶点颜色(3个一组) //纹理坐标(2个一组)0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,-0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f
};
//以上数据仅为本博文编造,不具有实操意义
由以上数据可见,顶点数据并非只是三个为一组的三维坐标!
如果我们向VBO中传入了以上buffer,并且VBO把它们送入了GPU。
然而,顶点着色器不知道该如何解释这些数字,到底是把它们3个一组,还是先3个一组、后2个一组,或者是3个、2个、3个?
GPU并不知道。
这就需要VAO的参与了,它负责告诉GPU,VBO中的信息到底该以几个为一组。如下这一段程序,就是把对VBO中数据的描述存到了一个VAO中:
//vertex coordglVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// color attributeglVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);// texture coord attributeglVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));glEnableVertexAttribArray(2);
上面程序看似有三段(glVertexAttribPointer()
+ glEnableVertexAttribArray()
为一段),但它们都存在同一个VAO里。(这里就不介绍glVertexAttribPointer()
和glEnableVertexAttribArray()
函数的作用了,不懂的读者可以上网去查。)
在一些复杂的OpenGL程序中,VBO可能会有多个,但VAO只有一个。那么,如何用一个VAO来解释多个VBO呢?
三、一个VAO和多个VBO
在OpenGL程序中,VBO可能会有多个,但VAO只有一个。那么,如何用一个VAO来解释多个VBO呢?
这就涉及到OpenGL的上下文知识:一个完整的OpenGL程序相当于一个容器,我们在用到VAO、VBO时,需要先绑定(Bind操作)、再使用,没有经过绑定的VAO/VBO是不起作用的。
一个VAO和多个VBO之间的关系大致如下所示:
那么,根据一个VAO与多个VBO的关系,以及OpenGL上下文(绑定)的知识,用一个VAO来解释多个VBO的操作流程就如下:
首先,绑定VAO,以告知OpenGL程序该使用这个VAO来对VBO做出解释。然后,绑定第一个VBO,向这个VBO中写入数据,告知VAO该如何解释这个VBO的信息;
然后,解绑这个VBO。然后,绑定第二个VBO,向这个VBO中写入数据,并在VAO中保存该如何解释这个VBO的信息;
然后,解绑这个VBO。
……
如下一段程序:
unsigned int VBO[2], VAO;glGenVertexArrays(1, &VAO);glGenBuffers(2, VBO);//=========================绑定VAO===============================glBindVertexArray(VAO);
//===============================================================//=======================绑定第一个VBO============================glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
//===============================================================glBufferData(GL_ARRAY_BUFFER, sphereVertices.size() * sizeof(float), &sphereVertices[0], GL_STATIC_DRAW); //向第一个VBO中写入数据//================告知VAO该如何解释第一个VBO的信息=================glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);
//===============================================================//=======================解绑第一个VBO===========================glBindBuffer(GL_ARRAY_BUFFER, 0);
//===============================================================//=======================绑定第二个VBO============================glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
//===============================================================glBufferData(GL_ARRAY_BUFFER, sizeof(texVertrices), texVertrices, GL_STATIC_DRAW);//向第二个VBO中写入数据//================告知VAO该如何解释第二个VBO的信息=================glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);glEnableVertexAttribArray(1);
//=============================================================
【图像】【OpenGL】VAO和VBO的关系相关推荐
- 【Opengl】 VAO与VBO的关系
转载 这里 目录 一.VBO的作用 二.VAO的作用 三.一个VAO和多个VBO 注: VAO和VBO都是用来存储顶点信息的,并把这些信息送入顶点着色器.至于什么是顶点和顶点着色器,这里就不多说了,不 ...
- [OpenGL] VAO、VBO、EBO
一.BO(Buffer Object,缓冲对象) 缓冲对象是OpenGL管理的一段内存,为了与我们CPU的内存区分开,一般称OpenGL管理的内存为:显存. 显存,也就是显卡里的内存.显卡访问显存比较 ...
- OpenGL VAO与VBO
绘画三角形: glDrawArray(GL_TRIANGLES, 0, 3);//从第0个点开始取,取三个 标准化设备坐标(Nomalized Device Coordinates,NDC): 顶点着 ...
- 实验2.2——VAO,VBO的总结
这俩个O,前面搞了这么多链接,已经迷糊了,捋一捋吧. 事物的发展都是一个过程,所以如果能按着这个技术发展的过程来学习,应该就能捋顺了. 简单的说,如果能亲身经历一遍这个发展过程,重新"发明& ...
- OpenGL - 如何理解 VAO 与 VBO 之间的关系
系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGL LearnOpenGL 笔记 - 入门 02 创建窗口 LearnOpenGL 笔记 - 入门 03 你好,窗口 LearnO ...
- QT OpenGL(一 VAO、VBO、EBO使用)
1.什么是OpenGL? Open Graphics Library,它是一个由Khronos组织制定并维护的规范 OpenGL核心是一个C库,同时也支持多种语言的派生 核心模式 也叫可编程管线,提供 ...
- OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...
- 关于VAO,VBO和EBO的理解-OpenGL学习笔记
本文章首发于我的个人博客,希望大家多多支持! Hi! This is Showhoop Studio! 如果要从代码层面去理解渲染管线的工作,学习使用OpenGL编程可以说是一个不错的选择.这里我将记 ...
- OpenGL使用纯VBO方式渲染出三角形,非VAO
OpenGL使用纯VBO方式渲染出三角形,要设置兼容格式GLFW_OPENGL_COMPAT_PROFILE. // 必须使用VAO渲染 //glfwWindowHint(GLFW_OPENG ...
最新文章
- 97页PPT,读懂自动驾驶全产业链发展!
- 初步了解Linux内核中断初始化
- go genetlink demo
- c++静态成员变量使用前必须初始化,那么下面这个例子为什么不用初始化?
- 要玩转这个星际争霸II开源AI,你只需要i5+GTX1050
- 鲁尼禁赛萨哈一射一传领风骚 曼联客场3-0查尔顿
- python结课报告_Python数据分析课程到底是学什么内容的?
- SqoopFlume、Flume、HDFS之间比较
- SprinMVC 控制器忽略静态资源
- 10-10-020-简介-kafka的ZK上面的存储
- 关于string中的如果使用变量的笔记
- matlab win10 精简版下载,完美解决win10无法运行matlab问题
- 一篇文章带你读懂水晶易表的简介及其安装初识
- jQuery子页面刷新父页面--局部刷新+整体刷新
- 树莓派控制超声波传感器
- 2018年 中南大学研究生复试机试题(1025~ 1028)
- 上海程序员 落户攻略
- C语言中判断浮点数是否等于0
- 小硕期间所读的专业书
- java13下载安装_java jdk13安装版下载