OpenGL缓冲区对象之VBO

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

  • 简介

VBO是OpenGL提供的一种特性,主要是用于在非立即模式下(使用glBegin/glEnd这种方式)用来保存顶点数据(包括位置、纹理、颜色等),同时提供了更新这些数据的方法。 VBO相比较立即模式的渲染来说效率更高,这主要是因为VBO的数据一般会放在显存中而不是内存中。通俗点说VBO就好像是显卡中开辟的一块存储区域,用来把以前放在内存中的数据放在了显存中,便于更加方便的传输处理。  VBO特性是在OpenGL1.5版本引入的。

  •  VBO相关函数

OpenGL提供了几个对其进行操作的函数:

顶点缓冲区对象 API
glGenBuffers 创建顶点缓冲区对象
glBindBuffer 将顶点缓冲区对象设置为当前数组缓冲区对象(array buffer object)或当前元素(索引)缓冲区对象(element buffer object)
glBufferData 为顶点缓冲区对象申请内存空间,并进行初始化(视传入的参数而定)
glBufferSubData 初始化或更新顶点缓冲区对象
glDeleteBuffers 删除顶点缓冲区对象










  • 创建VBO

创建一个VBO需要3个步骤:

1. 新建一个新的缓冲区对象(调用 glGenBuffers)
2. 绑定缓冲区对象 (调用glBindBuffer)
3. 拷贝顶点数据到缓冲区对象中(调用glBufferData)

------------------------
glGenBuffer的函数原型如下:
void glGenBuffers  (GLsizei n, GLuint * buffers);
这个函数创建了新的缓冲区对象,并且返回这些对象的ID值,第一个参数是希望创建多少个缓冲区对象,第二个参数是传入接收这些对象ID的地址(如果是多个需要传入数组)

glBindBuffer的函数原型如下:
void glBindBuffer (GLenum target,GLuint buffer);
当我们创建好缓冲区对象之后,在使用之前需要先将该缓冲区对象设置为当前缓冲区对象(OpenGL是一个状态机,使用它的方式都是先切换在使用)。第一个参数是说明这个缓冲区是用来存储什么东西的。可以是存储顶点数组(GL_ARRAY_BUFFER) 或者是索引数组(GL_ELEMENT_ARRAY_BUFFER)。
这里需要注意: 所有顶点属性(如顶点坐标值、顶点纹理坐标、顶点法线和颜色)都必须使用GL_ARRAY_BUFFER。索引数组GL_ELEMENT_ARRAY_BUFFER是配合glDraw[Range]Elements()来使用的。
这个函数调用之后,VBO就被初始化完成。

glBufferData的函数原型如下:
void glBufferData(	
        GLenum  	target,
 	GLsizeiptr  	size,
 	const GLvoid *  	data,
 	GLenum  	usage);
当缓冲区初始化完成之后,可以使用glBufferData往里面写入数据。
target:取值是GL_ARRAY_BUFFER或者是GL_ELEMENT_ARRAY,含义与上文中所述的一致。
size:需要写入的数据大小(以字节为单位)
data:写入数据的指针,如果data是空,那么VBO仅仅保留size大小的空间
usage:是一种优化的参数,根据实际使用情况来选定,可以有9种取值(仅仅是建议,其实可以随便选,但是按照使用的特点选取特定的模式可以获得更好的表现)
GL_STATIC_DRAW_ARB
GL_STATIC_READ_ARB
GL_STATIC_COPY_ARB
GL_DYNAMIC_DRAW_ARB
GL_DYNAMIC_READ_ARB
GL_DYNAMIC_COPY_ARB
GL_STREAM_DRAW_ARB
GL_STREAM_READ_ARB
GL_STREAM_COPY_ARB
”STATIC“开头的单词意味着VBO中的数据不会变化(一次赋值多次使用)。
”DYNAMIC“开头的单词意味着VBO中的数据会经常变化。
”STREAM“开头的单词意味着VBO中的数据每一帧都会变化
”DRAW“表示数据传输到GPU中进行绘制(从Application到GL)
”READ“表示数据是客户端程序来读取(从GL到Application)
”COPY“则表示数据的流向既有DRAW同时也有READ
需要注意的是:基本上VBO都只会用到DRAW,COPY和READ一般是在FBO和PBO(稍后介绍)中使用。

glBufferSubData函数原型如下:
void glBufferSubData(	
        GLenum  	target,
 	GLintptr  	offset,
 	GLsizeiptr  	size,
 	const GLvoid *  data);

这个函数和glBufferData的作用有点类似,主要是向VBO中写入数据,但是它只是替换VBO中的一部分数据,另外在使用它之前的缓冲区对象必须先使用过glBufferData写入过全部的数据。(也就是说glBufferSubData不能更新一个全新的缓冲区对象[仅仅使用glBindBuffer,还未使用glBufferData写入的缓冲区])
参数含义与glBufferData基本类似,只不过它有一个offset偏移量,通过offset和size就能算出一个子区间,用来更新。

glDeleteBudffer函数原型如下:
void glDeleteBuffers(	GLsizei n,
 	const GLuint * buffers);
函数很好理解,既然glGenBuffers控制生,那么glDeleteBuffer就是控制死了。参数含义与glGenBuffers一样。回收缓冲区对象。

  • 使用方式

上文已经介绍了所有相关的API,那么看看如何使用。下面就是一个使用简单的代码:
GLuint vboId;                              // 声明一个VBO的ID值
GLfloat* vertices = new GLfloat[vCount*3]; // 存放VBO数据的数组(内存中)

// 新建缓冲区对象,并使用vboId来保存这个缓冲区的ID
glGenBuffers(1, &vboId);

// 绑定缓冲区对象,作为数据数组使用
glBindBuffer(GL_ARRAY_BUFFER_ARB, vboId);

// 写入内存中的数据到缓冲区对象中
glBufferData(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);

// 当拷贝数据到缓冲区对象中之后,内存中的数组对象可以安全的被释放
delete [] vertices;

// 程序结束后删除缓冲区对象(回收缓冲区以备之后使用)
glDeleteBuffers(1, &vboId);

  • 示例

关于VBO的示例可以参考 《VA AVO VBO 备忘》一文,里面有详细的参数和使用介绍。

  • 更新VBO

VBO的一个特点是它可以在客户端被修改(相比显示列表)。最简单的更新VBO数据的方式是将新的数据通过glBufferData或者glBufferSubData拷贝到VBO中,这种情况下总是有关于顶点数据的两份拷贝,一份在应用程序中一份在VBO中。

OpenGL提供了另一种修改缓冲区对象的方式,将缓冲区对象映射到客户端内存中。客户端可以使用这个映射的指针来修改缓冲区中的数据,相关的API包括:
void * glMapBuffer(	GLenum target,
 	GLenum access);
如果调用成功,会返回映射内存区的指针,失败返回NULL。
target参数的取值和glBindBuffer中target一样,access的取值包括以下几种
GL_READ_ONLY
GL_WRITE_ONLY
GL_READ_WRITE
另一个与之对应的API是
GLboolean glUnmapBuffer(	GLenum target);
当修改完VBO中的数据之后,必须调用Unmap函数解绑客户端的内存,如果成功返回GL_TRUE,失败返回GL_FALSE,如果返回GL_FALSE,说明VBO中的数据出现问题,需要重新发送数据。



参考文章:

OpenGL ES:理解VBO和VAO VBO(Vertex Buffer Object)顶点缓冲区对象,是OpenGL ES2.0之后一个可使用的功能。表示存在于GPU内存中的一个对象,用于存储顶点坐标、纹理坐标等相关信息。如果不使用VBO则是将顶点、纹理坐标等数据存放在CPU内存中,在每次绘制之前通过通IO将其传递到GPU中,这样做的缺点是显而易见的,每次传递的数据相同还要花费同样的IO开销,所以绘制这些数据不发生变化的物体尽量使用VBO方式,提升性能。下面是使用传统方法绘制的代码 首先获取顶点坐标是数据 public... 阅读详情

相关推荐

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

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

gongdiwudu的专栏 3710

OpenGL之VAO,VBO和EBO

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

u012861978的专栏 7274

【71页PPT】工业40及智能制造解决方案(附下载方式)

2013年,工业4.0平台发布白皮书,正式确立其发展战略。工业4.0不仅是技术的升级,更是制造业思维的重构。工业4.0的核心是通过信息物理系统(CPS)实现工厂内外的互联,构建高度灵活的个性化生产模式。它不仅是技术革新,更是一种生产方式的变革,使传统行业界限模糊化,催生新的商业模式和合作形式。德国作为制造业强国,其GDP的25%和出口总额的60%依赖制造业,因此工业4.0成为其维持全球领先地位的重要战略。CPS是工业4.0的基石,通过计算、通信与控制技术(3C)实现物理世界与信息世界的深度融合。

2501_92808811的博客 950

OpenGL原理与实践——核心模式(一):VBO、VAO等原理解析及项目初始设置

OpenGL原理与实践——核心模式(一):VBO、VAO等原理解析

最不正经的计算机专业学生 2270

生成对抗网络(GAN、DCGAN、ACGAN)-----学习笔记

生成对抗网络学习笔记 生成对抗网络有两个关键结构:生成模型、判别模型。 生成模型:输入是一个服从正态分布的N维向量,利用这个N维向量生成一张图片。 判别模型:对于生成模型输出的图像判别它是不是真的图像。 生成模型和判别模型的博弈关系在于:生成模型的目的是生成让判别模型无法判别真伪的图像,而判别模型的目的是判断输入图像的真伪。 结合代码来看生成对抗网络中,生成器和判别器的训练过程: 判别模型的训...

weixin_43227526的博客 5490

QT播放器插件内嵌浏览器配合流媒体实现国标摄像头网页端播放

基本原理在浏览器⽹页中的指定播放窗口的位置和⼤⼩,实现⼀个内嵌到⽹页中显⽰的播放窗⼝,前端还必须可对这个内嵌播放窗⼝进⾏控制,⽽且播放窗⼝必须跟随浏览器窗⼝的移动和缩放、⽹页滚动、标签页切换、关闭等操作进⾏⾃动联动。播放器可以通过QT实现。这个播放窗⼝同时提供Web Socket的服务端和JSON打包命令的解析执⾏模块,前端就可以通过Web Socket连接后发送JSON打包的控制命令实现控制播放窗⼝。

cameravision的博客 562

OpenGL学习笔记——VBO与VAO

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

九歌的博客 3084

CTK Plugin Framework插件框架学习1--Qt编译CTK

【代码】Qt编译CTK。

贝勒里恩的博客 7433

【我的OpenGL学习进阶之旅】介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果

在上一篇博客 【我的OpenGL学习进阶之旅】顶点属性、顶点数组 https://ouyangpeng.blog.csdn.net/article/details/121388737 中,我们介绍了 顶点属性 和 顶点数组。 这一篇博客,我们来介绍下 顶点缓冲区对象,并对比使用VBO和不使用VBO绘制三角形的效果 一、顶点缓冲区对象 1.1 顶点缓冲区对象介绍 使用顶点数组指定的顶点数据保存在客户内存中。在进行glDrawArrays或者glDrawElements等绘图调用时,这些数据必须从客户内存复制到

字节卷动 2736

uniapp [安卓苹果App端] - 实现APP开发后台保活+息屏后台持续运行效果,强制后台保活手机黑屏后进程存活后台保持网络连接或持续定位等功能提供支持(app后台运行休眠仍然可以确保一直运行)

uniapp APP开发后台保活,Uniapp-APP后台保活插件(安卓苹果ios后台保活)保证应用在后台继续运行,uniapp实现app保活 保后台运行 避免系统主动杀进程,如何让安卓APP一直在后台运行?uniapp 安卓 APP 后台持续运行(保活)iOS App后台保活,Android 后台运行白名单实现保活,保活息屏后台运行,uniapp后台保活,uniapp熄屏 后台运行,Android/ios进程保活/息屏后后台保持定位、网络运行,uniapp在android ios保活,挂后台可运行,安卓A

🏆 前端领域优质创作者 1万+

ABAP 7.40 FOR 表达式与 REDUCE 构造运算符深度解析:从语法新特性到真实项目实践

ABAP 7.40引入了FOR和REDUCE表达式语法,使代码更简洁和函数式。FOR支持内表迭代和条件迭代,可配合VALUE构造新内表,替代传统LOOP。REDUCE用于归约运算,将多值折叠为单一结果,如求和、拼接等。这些新特性让ABAP更现代化,与SAP新架构协同更好,提升了开发效率和代码可读性。

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

OpenGL系列教程之八:OpenGL顶点缓冲区对象(VBO)

相关主题:顶点数组,显示列表,像素缓冲区对象 下载:vbo.zip,vboSimple.zip 创建VBO 绘制VBO 更新VBO 例子 GL_ARB_vertex_buffer_object扩展通过提供顶点数组和显示列表的优点并且避免它们的不足提高了OpenGL的性能。顶点缓冲区对象(vertex buffer object,VBO)允许顶点数组存储在位于服务器端的高

3694

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 940

OpenGL顶点缓冲区对象(VBO)

OpenGL顶点缓冲区对象(VBO) 原文地址 目录 创建VBO 画出VBO 更新VBO 例子 创建VBO         GL_ARB_vertex_buffer_object 扩展可以提升OpenGL的性能。它提供了顶点数组和显示列表,这避免了低效实现这些功能。Vertex buffer object (VBO) 允许顶点数据储存在高性能显卡上,即服务端的内存中,改善数

dreamcs的专栏 1万+

用 CDS View I_APARToleranceGroup 管理客户与供应商收付差异容差:配置语义、字段解读与 ABAP 落地实践

财务共享服务中心常面临小额差异处理的挑战,SAP通过"客户/供应商容差组"机制实现自动清账规则配置。CDS视图I_APARToleranceGroup将配置数据转化为可查询维度,包含宽限天数、固定现金折扣等关键业务参数。该视图支持按公司代码和容差组查询差异处理策略,可用于报表开发、主数据校验和接口合规检查,帮助财务团队高效管理海量小额交易差异,减少手工操作。

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

顶点缓冲区对象(VBO)

顶点缓冲区对象(Vertex Buffer Object,VBO)是 OpenGL 中用于存储顶点数据的一个重要概念。VBO 允许开发者将顶点数据(如位置、法线、纹理坐标等)存储在 GPU 的内存中,从而提高渲染性能,减少 CPU 和 GPU 之间的数据传输。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 418

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OpenGL ES 学习教程(五) 极速绘制,使用 VBO (顶点缓冲区对象)!

在渲染流水线中,如果我们要渲染一个模型文件,比如一个从 3dmax中导出的茶壶,要经历以下过程 从硬盘读取模型数据,拷贝到内存中,然后每次绘制的时候上传到显卡。

Hello Captain 3967

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OpenGL-ES 学习(12) ---- VBO EBO VAO

VBO) 是指顶点缓冲区对象,而EBO)是指图元索引缓冲区对象,VBO和EBO实际上是同一类buffer按照用途的不同称呼编程中,用于绘制的顶点数组数据首先保存在系统内存,在调用或者等进行绘制的时候,需要将顶点数组数据从系统内存拷贝到显存,但是很多时候我们没必要在每次绘制的时候进行内存拷贝,如果可以在显存中缓存这些数据,就可以在很大程度上降低内存拷贝带来的开销OpenGL-ES数组缓冲区对象指定数组缓冲区对象用于创建保存顶点数据的缓冲区对象元素数组缓冲区对象用于创建保存图元索引的缓冲区对象。

小猪佩奇的博客 1268

【OpenGL ES】顶点缓冲区对象VBO与顶点数组对象VAO

【完整示例代码】https://github.com/geminy/aidear/tree/master/graphics/mu/examples/opengles3顶点属性即顶点数据,可以通过顶点数组逐顶点指定,也可以为所有顶点指定一个常量,所有OpenGL ES 3.0实现必须支持至少16个顶点属性,应用程序可以通过glGetIntegerv查询GL_MAX_VERTEX_ATTRIBS得到支持

Making Life Better. Making Others Better. 5007

OpenGL中VAO、VBO和EBO的区别

VBO(Vertex Buffer Object)顶点缓冲区对象 VAO(Vertex Array Object)顶点数组对象 EBO(Element Buffer Object)索引缓冲对象 三者联系与区别

qq_36831368的博客 1988

GLES 顶点缓冲区对象(VBO)

使用顶点数组时,指定的顶点数据保存在系统内存中,在进行glDrawArrays 或者glDrawElements 的时候,需要把这些顶点数据复制到显卡内存。很麻烦。其实我们想想,直接把顶点数据保存在显卡内存中,这样不是就免去了复制这一步操作。这种方法可以改进渲染性能,而且降低了内存带宽消耗。

Hello Captain 2722

绑定 VBO是做了什么事情

绑定 VBO 是将一个特定的顶点缓冲区对象与当前 OpenGL 上下文关联的过程。通过绑定 VBO,开发者可以方便地管理和使用顶点数据,从而实现高效的图形渲染。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 219

opengl中VAO,VBO,IBO用法小结(zz)

opengl中VAO,VBO,IBO用法小结 这三个玩意全面取代旧社会的glBegin/glEnd,显示列表,顶点数组。 VBO为顶点缓冲区对象,用于存储顶点坐标/顶点uv/顶点法线/顶点颜色,也可以用于其他用途,比如tangent。 IBO为索引缓冲区,里面的值可以是unsigned int或者unsigned short。 最后用VAO将多个VBO,IBO绑定到一起。 一个常

whl_cxy的专栏 1767
上一篇: OpenGL渲染管线---概述(一)
下一篇: OpenGL API 之 glPixelStore(2)
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值