实验2.2——VAO,VBO的总结

关于VAO、VBO、EBO的理解 VBO是一堆顶点,但你不知道这些顶点代表什么。VAO会告诉OpenGL什么是位置、颜色、纹理、法向量、索引,这些含义组成了VAO。比如VBO是画笔,颜料,画布;VAO就是画家,利用这些原料完成一幅作品。复习 - LearnOpenGL CN。VBO,有需要的话会加一个EBO。 阅读详情

这俩个O,前面搞了这么多链接,已经迷糊了,捋一捋吧。

事物的发展都是一个过程,所以如果能按着这个技术发展的过程来学习,应该就能捋顺了。

简单的说,如果能亲身经历一遍这个发展过程,重新”发明“出VAO+VBO,自然就明白啥是VAO,VBO了。

过程1——立即渲染模式

这里不从网上找概念,因为我是小白,找了也看不懂,直接弄一点感性认识就可以了,小白不能要求太高嘛……

好像这样的就是所谓的立即渲染模式

glBegin( GL_TRIANGLES );

    glVertex3f(-1.0f, -0.5f, -4.0f);

    glVertex3f( 1.0f, -0.5f, -4.0f);

    glVertex3f( 0.0f, 0.5f, -4.0f);

glEnd();

它是通过这些函数调用,来实现图形数据从CPU到GPU的传输的,这就存在两个问题。

  • 函数调用,需要压栈,弹栈什么的,很花时间
  • 数据传输需要时间,因为这些零件没有集成在一起。如下图(引用自这里)所示,CPU,GPU,内存,相互之间都是存在一定的距离的,虽然电信号传的快,但传输时间也不会是0.

过程2——使用VBO

天地万物之理,无独必有对。 问题能出现,就会有解决方法。

 这是那个曾经看过的浏览量很高的pyopengl的教程

从高亮的那句话,就能这么猜测一下——在历史上,是先出现的VBO,再出现的VAO+VBO

 引用自:

(31条消息) 写给 python 程序员的 OpenGL 教程_天元浪子的博客-优快云博客_写给python程序员的opengl

调用函数传数据到GPU,很花时间,那末,直接把数据放到显存里,绘制的时候直接让GPU从显存里取,不就快了吗?

这个其实就是VBO。

这个链接里面有完整的代码,试了试,可以运行的:

(31条消息) OpenGL使用纯VBO方式渲染出三角形,非VAO_AppNinja的博客-优快云博客_opengl vbo使用

 拿前面那个绘制彩色三角形的改了改,也实现了纯VBO——没用VAO,只搞了两个VBO,用来存这两个三角形的数据。

代码在这里

结果是这个: 

不用VAO好像也可以,就是写代码的时候麻烦了一点。

过程3——使用VAO管理VBO

在上一个过程中,是不是觉得这么写比较麻烦?

而且,这还只是2个图形,各2个属性的情况,多了只会更麻烦…… 

 那末,怎么办?——往上再封装一层。【封装,有计算机内味儿了】

VAO的诞生——VBO+封装 

网页1 

 这个链接,详细生动的说明了VAO到底是什么:

VAO(Vertex Array Object)简单理解其实代表的就是模型的数据,我们可能需要很多个模型,所以需要有个id来区分,所以创建vao的时候会返回一个vaoID。VAO中有一个属性列表,默认有16个属性(0 - 15),我们可以为属性指定数据,其中属性可以是顶点位置,颜色,法线,纹理坐标等等我们需要的数据,其中的每一个属性对应的数据其实就是VBO(vertex buffer object)。

OpenGL有两类函数,第一种是状态设置函数,第二种是状态使用函数。比如对于vao对象,glBindVertexArray(vaoID)函数就是状态设置函数,glVertexAttribPointer就是状态使用函数,用来为属性列表中的某个属性绑定数据,绑定的数据就是vbo,如果我们已经为vao绑定过数据了,下一次使用的时候就不需要重新绑定了,直接使用这个vao就可以了,相当于我们已经有模型的数据了。在bind和unbind(就是调用glBindVertexArray(0))之间的操作都是针对这一个vao对象的。形象的理解两者之间的关系可以看下图:

引用自:

vao和vbo - 知乎 (zhihu.com)

网页2 

 配合下面这个一起看,风味更佳:

 上面那个图,和下面这个图,连起来看,就知道具体的VAO是什么了,而不是抽象的VAO。

引用自:

(31条消息) [OpenGL] VAO、VBO、EBO_Zeehoy的博客-优快云博客_opengl vbo

网页3 

关于上图中红色的VAO里的那个类似长度16索引为0--15的线性表数据结构,还可以再接着认识:

 里面的代码,试了试,是可以运行的


#include <iostream>
#include "glad/glad.h"
#include "GLFW/glfw3.h"


// 屏幕宽,高
int screen_width = 1280;
int screen_height = 720;

int main() {
    // 第一部分,初始化GLFW和GLAD,分为4个步骤进行/////////////////////////////////////////////////////////

    // 初始化GLFW
    glfwInit();                                                     // 初始化GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                  // OpenGL版本为3.3,主次版本号均设为3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 使用核心模式(无需向后兼容性)
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // 如果使用的是Mac OS X系统,需加上这行
    glfwWindowHint(GLFW_RESIZABLE, false);						    // 不可改变窗口大小

    // 必须使用VAO渲染
    //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    // 渲染出纯VBO三角形
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);

    // 创建窗口(宽、高、窗口名称)
    auto window = glfwCreateWindow(screen_width, screen_height, "Triangle", nullptr, nullptr);
    if (window == nullptr) {                                        // 如果窗口创建失败,输出Failed to Create OpenGL Context
        std::cout << "Failed to Create OpenGL Context" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);                                 // 将窗口的上下文设置为当前线程的主上下文

    // 初始化GLAD,加载OpenGL函数指针地址的函数
    // 在调用任何OpenGL函数之前
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // 指定当前视口尺寸(前两个参数为左下角位置,后两个参数是渲染窗口宽、高)
    glViewport(0, 0, screen_width, screen_height);

    //查询硬件支持的顶点属性的上限
    int nrAttributes;
    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes);
    std::cout << "Maximum nr of vertex attributes supported: " << nrAttributes << std::endl;

 
    return 0;
}

运行结果

明白了,3060移动端VAO支持16种顶点属性。

这就是解释了为什么上面那个图,线性表的长度画的是16,而不是15或者17或者别的什么东西。

 引用自:

(31条消息) OPENGL学习笔记之glEnableVertexAttribArray函数_Sean_gGo的博客-优快云博客_glenablevertexattribarray

网页4 

这个链接,可以当成一个总结来看:

一个VAO对应一个物体,一个VBO对应一个物品的所有属性 (顶点坐标、颜色等,除顶点索引外),而一个EBO仅对应一个物品的一种属性(顶点索引属性)。

 关于VAO的使用与否,这里又见到了。

还是以具体代码形式的,挺好的。

  • 只是用VBO,需要重复设置属性指针
  • VAO+VBO,可以少写点代码,一句就画出了2个三角形。【与下面的那个”渲染的代码“是呼应的】

引用自:

(31条消息) OpenGL中VAO、VBO和EBO的区别_码农高射炮的博客-优快云博客_vao vbo区别

网页5

这个链接,关于VAO和VBO的每个函数,都画了图来解释,图很漂亮,文字也很详细,是一个不错的总结,适合我这样的0基础小白,从0开始建立一个感性认识,快速了解这些抽象的BO函数。

就是这里没给渲染的代码:

 但是问题不大,因为网页4里有,可以互补着看。

这个”渲染的代码“,大概就是gldrawarray什么的。

引用自:

(31条消息) [OpenGL] VAO、VBO、EBO_Zeehoy的博客-优快云博客_opengl vbo

网页6

 《渲染的代码》

最早我是在这个链接里见到VAO下如何通过代码来绘制图形,复用的。

引用自:

(31条消息) 详解Opengl中VBO和VAO_代码乐的博客-优快云博客_opengl vbo

其它

 还有更猛的,多个VAO与多个VBO

(31条消息) 多个着色器与多个VAO,VBO绘制三角形_LV小猪精的博客-优快云博客_多个vbo

小白,暂时学不了那末多,先算了吧……

实际操作

对VAO,VBO有了更深一点的了解。

同时也认识到了,你这里面的,《一个VAO,两个VBO,两个三角形》,的那个最终运行成功的代码,VAO了个寂寞……

昨天写的认为是对的代码,今天可能就认为不对了。

反者道之动,事物总是在不断走向反面的过程里发展,也没毛病。

改!

改了的代码在这里

运行结果还是这个,但是代码已经变了。

这个是之前渲染部分的代码:

 这个是改了的代码:

简洁了一些,更像是一个心智健全的人写的代码了。

这个可能就算是一种进步吧。 

VAO与VBO VAO与VBO 本文旨在解释VAO(vertex array object)和VBO(vertex buffer object)的相关概念。 随着OpenGL状态和固定管线模式的移除,我们需要一种新的方式来将数据传输到图形卡以渲染图形。我们可以采用VBO,或者是在OpenGL3以上版本引入的新的特性VAO。我们可以把同一个渲染对象的顶点数据和颜色存储在处于同一个VAO中的不同VBO中。 –V... 阅读详情

相关推荐

[Modern OpenGL]谈谈VAO、VBO、IBO

OpenGL中的VAO、VBO、IBO刚开始学习OpenGL的时候可能会对VAO、VBO、IBO的概念有些模糊,只是记得这些术语和API。 理清概念才能更好的使用这些API,下面我们花20分钟的时间谈谈这些术语。 VBO : Vertex Buffer Object,顶点缓冲对象。 这里的Object和面向对象编程没有太大关系,他俩之间最沾边的就是合理的使用了抽象这一概念。 我们都知道所有的顶点

六天 4000

OpenGL之VAO,VBO和EBO

缓冲对象是OpenGL管理的一段内存,为了与我们CPU的内存区分开,一般称OpenGL管理的内存为:显存。显存,也就是显卡里的内存。显卡访问显存比较快,而Buffer Object,就是由OpenGL维护的一块显存区域。比如说在一块显存为2G的显卡里,分配了128K大小的内存区域给OpenGL使用,这个128K大小的内存区域,就叫一个Buffer Object。由于显卡访问显存,比访问内存(CPU里的内存区域)要快很多。而且显卡做运算,一般都是访问显存的数据,然后运算得到结果,并把结果也都保存在显存中。

u012861978的专栏 7274

OpenGL——VAO,VBO,EBO等对象的使用

OpenGL——VAO,VBO,EBO等对象的使用最近在学OpenGL为接下来的秋招做准备。OpenGL的对象让我花了很大的脑筋去理解,这里整理我现在遇到的常用对象。 VBO(Vertex Buffer Object):顶点缓冲对象 VAO(Vertex Array Object):顶点数组对象 EBO(Element Buffer Object):索引缓冲对象 着色器对象 VBO(Vertex B

dreamiond的博客 2845

【图像】【OpenGL】VAO和VBO的关系

目录一、VBO的作用二、VAO的作用三、一个VAO和多个VBO 注: VAO和VBO都是用来存储顶点信息的,并把这些信息送入顶点着色器。至于什么是顶点和顶点着色器,这里就不多说了,不了解的读者可自行优快云。 VBO的B为Buffer之意,用来存储顶点数据;VAO的A为Array,但我认为理解为 Attribute(属性) 之意更好,意思是 Buffer(VBO)的属性。 即,我们用VBO来存储数据,通过VAO来告诉计算机这些数据分别有什么属性、起什么作用。 一、VBO的作用 VBO是 CPU 和 GPU

怕走崎岖路,莫想登高峰 5742

初学OpenGL之VBO、VAO、EBO\IBO

初学OpenGL之VBO、VAO、EBO\IBO

qq_35038618的博客 1778

【Opengl概念01】VBO和VAO到底是个啥关系?

对于Opengl中的VBO和VAO相信很多人都熟悉这2个名字,但是有时候缺容易混淆2个概念或者说不理解这2个概念的作用是什么。本文对这2个概念做了对比和参照。

gongdiwudu的专栏 3710

【Opengl】 VAO与VBO的关系

转载 这里 目录 一、VBO的作用二、VAO的作用三、一个VAO和多个VBO 注: VAO和VBO都是用来存储顶点信息的,并把这些信息送入顶点着色器。至于什么是顶点和顶点着色器,这里就不多说了,不了解的读者可自行优快云。 VBO的B为Buffer之意,用来存储顶点数

一个老菜鸟的学习分享 7165

Jenkins离线安装保姆级教程:从下载.war包到SVN+Maven项目一键部署(附避坑脚本)

本文详细介绍了Jenkins离线安装的全流程,包括.war包下载、SVN+Maven项目配置及自动化部署。特别针对内网环境提供解决方案,涵盖插件管理、开发工具链配置、构建触发器和SSH部署等关键步骤,帮助企业在网络隔离环境下实现高效持续集成。

weixin_30096975的博客 374

OpenGL——VAO与VBO

转载自链接: 这里注: VAO和VBO都是用来存储顶点信息的,并把这些信息送入顶点着色器。至于什么是顶点和顶点着色器,这里就不多说了,不了解的读者可自行优快云。VBO的B为Buffer之意,用来存储顶点数据;VAO的A为Array,但我认为理解为 Attribute(属性) 之意更好,意思是 Buffer(VBO)的属性。即,我们用VBO来存储数据,而用VAO来告诉计算机这些数据分别有什么属性、起什么作用。VBO是 CPU 和 GPU 之间传递信息的桥梁,我们把数据存入VBO(这一步在CPU执行),然后V

欢迎来到我的博客小天地 3054

V93000 SmarTest 8入门:从零搭建你的第一个半导体测试程序

半导体测试是芯片从设计走向量产的关键环节,而ATE(自动化测试设备)正是支撑这一环节的核心工具。理解ATE测试程序开发的基本原理,不仅需要掌握测试机台的硬件架构,还要熟悉其软件环境中的管脚映射、电平时序、测试流程等底层逻辑。V93000作为爱德万的主力平台,其SmarTest 8环境通过对象化与流程化设计,将复杂的芯片测试任务拆解为可配置、可复用的模块,极大提升了并行测试效率与调试的便利性。无论是数字逻辑芯片的功能验证,还是模拟混合信号器件的参数测量,掌握SmarTest 8的核心操作都能帮助你快速搭建出可

weixin_31476015的博客 244

在ubuntu上安装FastSufer【本机安装】

其实说是安装,只需要将文件下载并解压即可。推荐教程注意版本:在下面这个网址根据你的操作系统找到最新的版本安装。比如我的操作系统为Ubuntu 20.04.5,因此我安装ubuntu20-7.4.1的freesurfer打开~/.bashrc在~/.bashrc文件中添加以下三行关闭~/.bashrc更新~/.bashrc安装tcsh注意每次进入终端使用freesurfer时需要输入FREESURFER_HOME路径根据freesurfer的文件夹所在位置自己修改。

Xingwen_future的博客 2009

OpenGL学习笔记——VBO与VAO

介绍和学习VBO VAO的概念及使用

九歌的博客 3084

保姆级教程:用MediaPipe和BlazePose在Python里实时追踪你的健身动作(附完整代码)

本文提供了一份详细的Python教程,教你如何使用MediaPipe和BlazePose实现实时健身动作追踪。从环境配置、模型选型到实时视频流处理架构设计,再到健身动作量化分析和可视化反馈系统优化,教程涵盖了完整的实现步骤和代码示例,帮助开发者快速构建高效的姿态特征点检测系统。

weixin_42531779的博客 153

【OpenGL】一文说透 VAO 与 VBO 的关系

在 OpenGL 的世界里,VAO(Vertex Array Object)和 VBO(Vertex Buffer Object)是两个非常重要的概念。它们各自扮演着独特的角色,但又紧密相连,共同为我们的图形渲染工作发挥着巨大的作用。今天,就让我们来深入探讨一下 VAO 与 VBO 之间的关系,揭开它们神秘的面纱。

同学小张的博客 1492

HALCON卡尺模型实战:5分钟搞定工件尺寸测量(附完整代码)

本文详细介绍了HALCON卡尺模型在工件尺寸测量中的实战应用,通过5分钟快速搭建测量系统的完整指南,包括基础配置、高级参数调优和完整代码示例。卡尺模型能自动识别边缘并计算精确尺寸,显著提升工业视觉检测的效率和一致性,特别适用于实时测量场景。

weixin_42570296的博客 463

1.14、基于NARX神经网络的磁悬浮建模(matlab)

数据准备:首先,需要准备用于训练和测试的磁悬浮系统的输入和输出数据,包括磁力、电流、位置、速度等信息。数据可以被保存在MATLAB的数据文件中,并加载到工作空间中。使用MATLAB的神经网络工具箱,创建一个NARX神经网络。需要定义网络的层次结构、节点数、激活函数等参数。通常,NARX网络包括自回归层和外部输入层。数据预处理:对加载的数据进行预处理,包括去除噪声、归一化处理等操作,以确保数据质量和网络训练的稳定性。使用MATLAB的训练函数,如trainlm或者trainbr,对NARX神经网络进行训练。

XU157303764的博客 1999

四、OpenGL中VBO与VAO的使用及本质

本文主要介绍OpenGL中VBO与VAO的使用方法。

TechNomad的博客 1766

lammps案例:聚乙烯和石墨烯界面pull out模拟

大家好,我是小马老师。 本文介绍lammps模拟计算界面结合力的一个案例。 本案例参考论文《The interfacial mechanical properties of functionalized graphene- polymer nanocomposites》,对论文作者表示感谢。 模型共分2层,上层为聚乙烯模型,下次为单层石墨烯,模拟过程共分3部分:建模、弛豫、拉伸。 (1)建模 使用MS建立聚乙烯和石墨烯模型,具体方法可参考之前的推文,使用build layer方法建立聚乙烯和石墨烯组合模型,

lammps_jiayou的博客 3496

OpenGL之VBO、VAO、EBO 详解

用于在显存中存储顶点数据(如位置、颜色、纹理坐标等)。通过一次性传输大量顶点数据到GPU,减少CPU与GPU间的频繁通信,提升渲染效率‌。用于管理VBO和EBO的状态(如顶点属性指针、绑定的缓冲区等),简化渲染流程。一个VAO可记录多个VBO的配置,避免每次渲染时重复设置‌。存储顶点索引数据,通过复用顶点数据减少重复顶点数量(例如绘制矩形时,6个顶点可简化为4个顶点+6个索引),降低内存占用并提高性能‌。(通过索引绘制)‌。

深之JohnChen的专栏 1979

人工蜂群优化算法(ABC)详解:原理、实现与应用

人工蜂群算法(Artificial Bee Colony, ABC)是Karaboga于2005年提出的一种群体智能优化算法,其灵感来源于蜜蜂群体在自然界中高效的采蜜行为。该算法通过模拟雇佣蜂、观察蜂和侦察蜂三种角色的分工协作来寻找最优解。在ABC算法中,每个潜在的解决方案被视为一个“食物源”,其质量由适应度函数评估。雇佣蜂负责在已知优质食物源附近进行局部开采;观察蜂根据雇佣蜂分享的信息,以一定概率选择并跟进优质食物源;侦察蜂则随机探索新区域,防止种群陷入局部最优。

qq_42212808的博客 393

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

OpenGL - 如何理解 VAO 与 VBO 之间的关系

在上一章LearnOpenGL 笔记 - 入门 04 你好,三角形中引入了很多很多概念,VBO、VAO、EBO、Shader 等等。密集的知识点向你轰炸而来,让这一章的难度陡然上升。说实话,这一章相当的劝退我。我心中有太多的困惑没有得到解答,文章虽然对 VBO、VAO 等做了解释,但其解释没有能让我这个入门者理解。以至于让阅读者相当的挫败。今天我尝试将本章概念「幼儿园」化,站在入门菜鸟的角度,以伪代码的形式来理解 VAO、VBO 等概念。

记录学习的过程 1949

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

opengles,VBO,EBO,VAO啥含义,使用流程

初始化阶段创建VAO、VBO和EBO。绑定VAO,然后绑定VBO和EBO。将顶点数据和索引数据分别复制到VBO和EBO中。配置顶点属性指针。渲染阶段绑定VAO。使用或进行绘制。通过这种方式,VBO、EBO和VAO共同协作,实现了高效的顶点数据管理和渲染。// 初始化阶段// 配置 VAO// 配置 VBO// 配置 EBO// 设置顶点属性// 位置属性(前 3 个分量)// 颜色属性(后 3 个分量)// 解绑 VAO// 渲染阶段。

b1tb1t的博客 1503

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OpenGL 理解VAO VBO 和 IBO

VAO VBO 和 IBO 曾经有一个老师在教我们的时候,给我们说了一句很实在的话,当你接触一个新的领域的时候,什么最压人?名词最压人,随便一个专有名词都够你吃一壶的。事实上确实如此。 学习OpenGL首先,先要弄明白的三个名词就是VAO,VBO和IBO。我们学习一个东西的时候,往往被过多,过详细的数据,淹没真正核心的那几句话,这可能也是不同人学习能力不一样的原因把,我应该属于学习...

正经的时候都在打游戏 1892

VAO VBO IBO的理解

VAO & VBO VAO是一个对象,一个VAO可以包含都多个VBO,是一种关联关系 顶点数组对象(Vertex Array Object,VAO)可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在这个VAO中。 VBO可以有保存不同的类型,包括顶点坐标、UV、法线、颜色、索引等 通过glBufferData给VBO可以指定相应的类型,再通过glVertexAttribPointer给VBO指定相应的数据格式 VBO归根到底是显卡存储空间里的一块缓存区(Buffer)而..

技术笔记 1370

opengl中VAO,VBO,IBO用法小结

http://cowboy.1988.blog.163.com/blog/static/751057982014380251300/ opengl中VAO,VBO,IBO用法小结 这三个玩意全面取代旧社会的glBegin/glEnd,显示列表,顶点数组。 VBO为顶点缓冲区对象,用于存储顶点坐标/顶点uv/顶点法线/顶点颜色,也可以用于其他用途,比如tangent。

游戏人生 2560
上一篇: 实验2.1——彩色三角形的显示
下一篇: PyOpenGL与核心模式
averagePerson
博客等级 码龄5年 381粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值