关于OpenGL利用VBO绘制以及VBO和VAO的关系

OpenGL VBO学习 OpenGL Vertex Buffer Object (VBO) GL_ARB_vertex_buffer_object扩展旨在通过提供顶点数组和显示列表的有点来增强 OpenGL 的性能,同时避免它们实现的缺点。顶点缓冲对象 (VBO) 允许顶点数组数据存储在服务器端的高性能图形内存中,并促进高效的数据传输。如果缓冲区对象用于存储像素数据,则称为像素缓冲区对象(PBO)。 使用顶点数组可以减少函数调用次数和共享顶点的冗余使用。但是,顶点数组的缺点是顶点数组函数处于客户端状态,每次引用数组中的数据都必须重 阅读详情

关于OpenGL利用VBO绘制以及VBO和VAO的关系

前言

VBO和VAO是OpenGL中非常重要的概念,这里先解释一下是什么意思:

顶点数组对象:Vertex Array Object,VAO
顶点缓冲对象:Vertex Buffer Object,VBO

初学者很容易弄错两者的关系 刚开始我也弄错了QAQ,这里就来详细解释一下:

VBO

  全称Vertex Buffer Object,是用来储存顶点数据的,我们知道:将数据从CPU发送到显卡是非常慢的,所以,就需要这样一个东西,将顶点数据一次性发送到显卡,提高渲染的效率,创建VBO的流程大概是这样的:

glGenBuffers(1, &VBO); // 创建一个VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO); // 绑定顶点数据缓存空间
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 发送数据

  这里简单说一下:GL_ARRAY_BUFFER 指的是OpenGL提供的几种缓冲区中的一种,类似比较常用的还有:GL_ELEMENT_ARRAY_BUFFER ,这些缓冲区是用来缓存待发送的数据的,当数据全部复制到缓冲区GL_ARRAY_BUFFER ~(即 glBindBuffer(GL_ARRAY_BUFFER, VBO); )~ 之后,再通过 glBufferData 发送数据到显卡上,这样就完成了一次高效的数据传输。

VAO

  接着就是 Vertex Array Object ,我们用VBO向显卡发送了数据,但是显卡并不知道这些数据是干嘛的,以及怎么使用这些数据,这时候就需要VAO来描述这些数据了,VAO还有一个好处,一个VAO可以对应多个VBO,这样绘制起来就很方便。

注意:OpenGL的核心模式要求我们使用VAO,所以它知道该如何处理我们的顶点输入。如果我们绑定VAO失败,OpenGL会拒绝绘制任何东西。

同样,创建一个VAO也很简单:

glGenVertexArrays(1, &VAO); // 创建一个VAO
glBindVertexArray(VAO);	// 绑定VAO
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); // 利用VAO描述顶点属性
glEnableVertexAttribArray(0);	// 启用着色器中的顶点属性

整合

  将上面所说的整合成一个类就是这样的:

注:BasicShader是用来编译着色器的。

class BasicDraw
{
public:
	~BasicDraw() {
		glDeleteVertexArrays(1, &VAO);
		glDeleteBuffers(1, &VBO_Vertex);
		glDeleteBuffers(1, &VBO_color);
	}

	// 初始化绘图==>创建VAO
	unsigned int Get_STATIC_VAO(float vertices[],int size_vertices, float color[], int size_color) {
		// 创建VBO和VAO
		glGenVertexArrays(1, &VAO);
		glGenBuffers(1, &VBO_Vertex); // 创建顶点和颜色的VBO
		glGenBuffers(1, &VBO_color);

		// 绑定VAO,这代表解绑这钱所有数据都会存到这个VAO中
		glBindVertexArray(VAO);

		// 提交数据
		/* 顶点VBO */
		glBindBuffer(GL_ARRAY_BUFFER, VBO_Vertex); // 绑定顶点数据缓存空间
		glBufferData(GL_ARRAY_BUFFER, size_vertices, vertices, GL_STATIC_DRAW);
		
		// 解析VBO中的数据
		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
		// 启用顶点属性==>即着色器中(location=0)的顶点属性
		glEnableVertexAttribArray(0);

		/* 颜色VBO */
		glBindBuffer(GL_ARRAY_BUFFER, VBO_color);
		glBufferData(GL_ARRAY_BUFFER, size_color, color, GL_STATIC_DRAW);
		glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
		glEnableVertexAttribArray(1);

		// 解绑VBO==>因为已经将数据发送到显卡了,所以可以安全的解绑
		glBindBuffer(GL_ARRAY_BUFFER, 0);
		// 解绑VAO
		glBindVertexArray(0);

		return VAO;
	}
private:
	unsigned int VBO_Vertex, VBO_color, VAO;
};

顶点数据

	float vertices[] = {
	-0.5f, -0.5f, 0.0f, // left  
	 0.5f, -0.5f, 0.0f, // right 
	 0.0f,  0.5f, 0.0f  // top   
	};

	GLfloat colors[] = {
	1.0f, 0.0f, 0.0f, 1.0f,
	0.0f, 1.0f, 0.0f, 1.0f,
	0.0f, 0.0f, 1.0f, 1.0f
	};

特别注意!

  如果是通过类来实现绘制功能,需要在参数里加上数组的大小,不然就会找俩小时错误都不知道错在哪QAQ,因为sizeof(ptr)一定是8字节,所以一定会出错!!!学的教训啊QAQ

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

相关推荐

关于VAO、VBO、EBO的理解

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

qigemingzia的博客 2305

OpenGL之VAO,VBO和EBO

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

u012861978的专栏 7274

[Modern OpenGL]谈谈VAO、VBO、IBO

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

六天 3999

catia V5R21 32位打开大型装配体非常卡,亲测可用解决方案

问题描述: 1.catia V5R21 32位 打开大型装配体非常卡 2.catia开启高速缓存后反而变卡 非常卡 卡死机 3.catia 在64位系统上安装32位的软件会不会影响性能发挥 4.明明电脑配置很高,比别人电脑配置高catia却比别人卡 5.catia跑不满CPU、内存、GPU,缺依旧非常卡 解决方案: 1.在catia中:工具-选项-基础结构-产品结构-高速缓存管理 a.勾选使用高速缓存系统 b.设置本地高速缓存路径 c.设置高速缓存大小(建议10G以上,根据自己硬盘剩余空间填写) d.确

UAVdeveloper的博客 2万+

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使用VBO+VAO绘制三角形

使用glew库和freeglut库。

m0_60352504的博客 402

LearnOpenGL入门章节学习记录:绘制三角形and一文搞懂VAO、VBO、EBO的设计模式

一文搞懂VAO、VBO、EBO的各种设计模式及用法,含源码。

qq_43070853的博客 733

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

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

gongdiwudu的专栏 3709

绘制一个矩形

在上一篇文章中,我们使用 glDrawArrays(GL_TRIANGLES, 0, 3) 绘制了一个三角形;其中,GL_TRIANGLES 表示我们要绘制的是三角形,那么,我们要怎么绘制矩形呢?把 GL_TRIANGLES 改为 GL_RECTANGLES?那么绘制五边形,六边形, n 边形呢?显然这样是行不通的。我们先来看下 glDrawArrays 的第一个参数。

weixin_56213682的博客 766

别再只看pLDDT了!AlphaFold预测结果解读保姆级指南:pLDDT、PAE、pTM、ipTM到底怎么看?

本文详细解析了AlphaFold预测结果中的关键指标pLDDT、PAE、pTM和ipTM,帮助用户从单一依赖pLDDT进阶到全面理解蛋白质结构预测。通过实际案例和技巧,指导如何正确解读这些指标,避免常见错误,并提供了从预测到发表的实用建议。

weixin_29100399的博客 355

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 367

详解Opengl中VBO和VAO

详解Opengl的VBO和VAO前言什么是VBO如何创建VBO什么VAO如何执行VAO 前言 对于Opengl中的VBO和VAO相信很多人都熟悉这2个名字,但是有时候缺容易混淆2个概念或者说不理解这2个概念的作用是什么。本人对Opengl的理解也很浅显,所以专门对这2个概念做了学习,这里记录下,便于以后查看。这里使用的Opengl版本为3.3版本,部分api可能在老版本的Opengl会报错。 什么...

代码乐的博客 1万+

microblaze之Video Processing Subsystem调试误区

内容:总结video processing subsystem调试中遇到的问题,以及在解决问题中的思路方法论,引为前车之鉴。 1,我的目的是希望采用vps中的scaler模块对图像进行拉伸缩小。IP的配置如下: 2,整个系统的框架图如下,仅比上期的内容增加了scaler模块,如下: 3,查手册,可以知道这个scaler only组件分成了hscale,vscale和GPIO,其中GPIO是控制上下游stream流控设备复位用,暂时忽略。 hscale和vscale的寄存器空间如下,主要关注图

YDY5659150的专栏 3555

【图像】【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

从零构建虚幻引擎体积云:参数调优与性能平衡的艺术

本文深入探讨了在虚幻引擎中构建逼真体积云系统的关键技术,包括Sky Atmosphere、Volumetric Cloud和Exponential Height Fog三大核心组件的协同工作。重点解析了体积云材质的高级控制、光照阴影的物理模拟以及性能优化策略,帮助开发者在视觉效果与性能之间找到最佳平衡点。

weixin_29012677的博客 938

vCenter Server出现no healthy upstream的解决方法

可以通过"VMware vCenter Server Management(服务)"来排查问题,在网页里面找到“服务”模块,会发现有很多服务没有启动起来,而且手动启动也无法启动。7.0 地址后,页面出现“no healthy upstream”,无法正常登录vCenter,重启后依旧如此,该故障的前提是没有对vCenter做过任何配置,如下图所示。于是用命令查询是否有证书过期,发现真有多个服务依赖的证书在当天早上过期。使用如下命令尝试打开服务发现不分服务可以打开,不分服务无法打开。

1万+

【Opengl】 VAO与VBO的关系

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

一个老菜鸟的学习分享 7165

SIwave仿真手册——电源完整性仿真之PDN阻抗的提取(四)

(想不到我这个弱鸡的博主有一天也有被催更的时候,看到后台被催的消息,我慌了,赶紧写一篇把。) 文章目录3.1 PDN阻抗的提取3.1.1手动完成PDN阻抗的提取1、创建pin group2、创建端口3、数据文件的清理和检查(参考1.3.4&1.3.5)4、添加电容模型(参考2.2.1)(==这一步很重要==)5、开始仿真6、查看仿真结果3.1.2利用向导工具完成PDN阻抗的提取1、点击图标![在这里插入图片描述](https://img-blog.csdnimg.cn/36d974339ea5449

luohuo9844的博客 1万+

[OpenGL] VAO、VBO、EBO

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

weixin_44179561的博客 5718

【AI智能体】Dify 搭建个人专属简历美化助手操作详解

Dify 搭建个人专属简历诊断助手实战操作详解

congge 4380

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

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

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

同学小张的博客 1492

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OPenGL 学习笔记之 VBO VAO EBO 概念和使用方法总结

目录 一.基本概念: 二. 理解缓冲对象 glVertex 函数 顶点数组(Vertex Array) 三. VBO(Vertex Buffer Object)顶点缓冲区对象 大体流程理解: Qt 中使用QOpenGLWidget 的VBO 例子 四. VAO(Vertex Array Object)顶点数组对象 Qt 中使用QOpenGLWidget 的VAO ...

学之知之的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OpenGL——VAO与VBO

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

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

TechNomad的博客 1766
上一篇: 关于Visual Studio C++相对路径的问题
下一篇: D. Robert Hood and Mrs Hood题解
ResCells
博客等级 码龄4年 191粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值