vbo,ibo,vao

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

1.VBO顶点缓冲区对象

一个顶点缓冲区对象如果存储顶点位置坐标、顶点法向量、顶点颜色信息,则需要使用三个VBO(vertex buffer object顶点缓冲区对象),VBO就是一个缓冲区,用于存储顶点的有关信息.

顶点属性以VBO 的形式传递给顶点着色器,VBO负责将数据传递给顶点着色器中的attribute变量(首先将顶点数据存储在VBO中。然后它告诉着色器哪些 VBO 与哪些attribute变量相关联,以便顶点着色器可以正确处理顶点)

创建VBO函数
//传入一个数组来创建VBO
function create_vbo(data){
    // 生成缓冲区对象
    var vbo = gl.createBuffer();
    // 绑定缓冲区(指定该缓冲区对象中要存储的数据类型)
    gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
    //将输出存入该缓冲区
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
    // 因为可以绑定到webgl中的缓冲区只有一个,这里设置为null为了确保使之前绑定的缓冲区无效
    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    return vbo;
}
VBO使用
// 将VBO绑定到当前webgl上下文
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
//激活/启用attribute属性(attribute变量地址[js变量])
gl.enableVertexAttribArray(attLocation);
//将缓冲区中的数据赋值给上面指定的attribute变量(着色器中)
gl.vertexAttribPointer(attLocation, attStride, gl.FLOAT, false, 0, 0);

注意:在执行gl.vertexAttribPointer(),一定要先检查那个VBO与那个attribute关联起来很重要,所以不要忘记事先将 VBO 绑定到 WebGL(bindBuffer)

2.IBO索引缓冲对象

使用索引缓冲区时,数据直接分配到GPU上的内存区域。不是每次绘制都把数据传给GPU,GPU从内存空间拉取数据,所以这样比每次都传数据要快很多。

创建IBO函数
function create_ibo(data){
    //创建一个空的缓冲区对象
    var ibo = gl.createBuffer();
    //通过参数gl.ELEMENT_ARRAY_BUFFER将该缓冲区对象指定为IBO
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
    // 将索引数据分配给缓冲区
    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(data), gl.STATIC_DRAW);
    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
    return ibo;
}
使用IBO
//将IBO绑定到当前webgl上下文
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
//绑定后便可以使用ibo绘制图形了
gl.drawElements(gl.TRIANGLES, index.length, gl.UNSIGNED_SHORT, 0);

3.顶点数组对象VAO

VAO是封装和包装顶点信息的对象是。VAO 使得更简洁地描述复杂和令人困惑的顶点缓冲区处理成为可能。

VAO简化了复杂顶点信息的管理。也就是说,VAO 本身并不能替代 VBO。一旦设置,VAO 就会存储有关顶点的信息

即使使用了VAO(VAO 只是它只是包装了 VBO 和 IBO),初始化VBO和IBO等处理应该基本相同。

function create_vao(vboDataArray, attL, attS, iboData){
    var vao, vbo, ibo, i;
    vao = gl.createVertexArray(); //创建VAO
    gl.bindVertexArray(vao);//绑定VAO
    for(i in vboDataArray){//创建VBO
        vbo = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vboDataArray[i]), gl.STATIC_DRAW);
        gl.enableVertexAttribArray(attL[i]);
        gl.vertexAttribPointer(attL[i], attS[i], gl.FLOAT, false, 0, 0);
    }
    if(iboData){//创建IBO
        ibo = gl.createBuffer();
        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
        gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Int16Array(iboData), gl.STATIC_DRAW);
    }
    gl.bindVertexArray(null);
    return vao;
}

使用vao
var sphereData = sphere(16, 16, 0.75); // 生成顶点数据函数
var sphereVAO = create_vao(
    [sphereData.p, sphereData.n, sphereData.t], //顶点的位置数据,法向量数据,纹理数据
    attLocation, //顶点的位置数据,法向量数据,纹理数据的地址变量
    attStride,  
    sphereData.i //顶点的索引数据
);

在自定义函数的开头和结尾只有绑定和解绑VAO的过程,其他的步骤其实都是饿创建VBO一样的。

初学OpenGL之VBO、VAO、EBO\IBO 阅读详情

相关推荐

实测OV5640 DVP/MIPI接口720p@60fps配置,为什么我的Zynq-7020开发板只有30帧?

本文深入解析了OV5640摄像头在Zynq-7020开发板上帧率减半的问题,从寄存器配置到硬件链路进行全面排查。重点分析了DVP/MIPI接口的720p@60fps配置,提供了关键寄存器设置、时序参数调整及硬件带宽验证方法,帮助开发者快速定位并解决帧率下降问题。

weixin_42634811的博客 344

webgl——VAO

上次说到了对VAO、VBO的理解,明白了使用VAO相比传统模式在IO方面对加载性能的提升,今天我对其在WebGL上进行了实现。         在WebGL中由于很多API与OpenGLES大为不同(一般常用的API大致是相同的),开始时费了很多劲,最后还是通过MSDN找到了相关的API及方法,这里对设计VAO的主要的部分进行介绍,对VAO还不是很理解的同学可以看这篇文章:http://blog

srk19960903的博客 1969

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理

跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。

sinat_37817094的博客 993

【WebGL】VAO和VBO理解

webgl

qq_22849251的博客 1534

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 228

手把手教你学Simulink——基于Simulink的多用户MIMO系统仿真建模示例

多用户MIMO概述在多用户MIMO系统中,基站配备多个天线,可以同时与多个用户进行通信。利用空间复用技术,不同用户的信号被分配到不同的空间流上,从而实现频谱资源的高效利用。多用户MIMO的核心挑战包括信道估计、波束成形设计以及干扰管理。关键技术点波束成形:通过调整发射信号的相位和幅度,在特定方向上增强信号强度并减少干扰。信道估计:获取每个用户的信道状态信息(CSI),用于优化波束成形矩阵。调制与解调:选择合适的调制方式(如QPSK、16-QAM等)以适应不同用户的信道条件。干扰消除。

MHD0815的博客 271

webgl基础原理1

1.webgl是在gpu上运行的,在gpu上运行的代码是以一对函数的形式,分别是vs(vertexshader)&fs(fragmentshader)这一对函数组合叫做(Program),webgl仅仅是resterization引擎。你需要使用点线,三角形来组合完成复杂3d图形。3.VBO顶点缓冲对象,缓冲区 VAO顶点数组对象 EBO元素缓冲对象(索引绘制))fs:绘制当前每个像素点的颜色(计算像素的最终颜色)2.vs:计算点的位置(把空间桌标转化成。4.左手系右手系 webgl是右手系。

Cu50moon的博客 614

为什么一个“时间片”能折腾 Linux 十年?

时间片扩展不是抢占调度器的控制权,也不是提升优先级。在“非常短暂、非常确定”的用户态临界区内,避免线程被不必要地抢占。用户态自旋锁(user-space spinlock)无系统调用的极短临界区高并发、低延迟的数据结构操作RSEQ(Restartable Sequences)保护区间一旦线程在临界区被抢占,系统整体性能反而下降。线程 A 拿着一个用户态锁线程 B 被调度上来,开始自旋等这个锁但 A 因为时间片用完,被调度器切走CPU 白白空转,所有线程都在浪费时间。

网络技术联盟站 254

OpenGL理解VBO,IBO,VAO

VBO和IBO很好理解,一般解释就是VBO保存着顶点的相关数据,IBO则是保存着对这些数据的索引 VAO名字是顶点数组对象,十分坑爹的名字,完全无法理解。 VAO我理解为用来保存VBO的数据是什么哪个属性(shader里的attribute) 结合代码会比较好理解 假设画一个正方形。 首先我们绑定了一块VBO,传入四个角的顶点数据。 float vert[] = { -1,-1, 1, -1, -1, 1, 1,1 }; glGenBuffers(1, &vertVbo); glBindBu

Mhypnos的博客 1312

【网络安全】浅谈数据库攻击复现及相关安全优化

4、准备数据库服务器为了安全正式环境应该把数据库单独放一台服务器,只允许让应用服务器 IP 来访问数据库服务器,通过独立两者,就算其中一台发生问题,另一台也是好的,进一步降低了危险性。5、定时备份数据库开发定时备份功能,可以使用 Crontab,或者其他框架,设定周期备份数据,哪怕是数据丢失或被删除也可以快速恢复。

2401_88545587的博客 221

SAP BW/4HANA 项目字段级数据血缘分析的方法与工具

利用SAP自带工具可以在一定程度上查看数据流和字段使用情况,但往往需要人工逐步深挖。适用于简单场景或验证单个字段的映射。借助SAP数据治理解决方案(如 Information Steward、Data Intelligence 等)能够自动整合元数据,提供图形化、跨系统的血缘分析,适合对数据 lineage 有严格要求的企业级项目。第三方工具则提供了灵活强大的功能,如自动文档、生成功能丰富的报告,对于复杂环境下的血缘分析和影响分析非常有帮助。自行开发SQL/CDS脚本。

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

WebGL之旅(三)VBO和多种图形绘制

gl.vertexAttribXX和gl.uniformXX函数,一次只能向shader中传递一个变量,要一次性向shader中传递多个数据就要用到顶点缓冲区对象(VBO)。一 VBOVBO使用步骤: 创建缓冲区对象(gl.createBuffer()); 绑定缓冲区对象(gl.bindBuffer()); 将数据写入缓冲区(gl.bufferData()); 将缓冲区对象分

寒风的技术博客 2972

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》 整合了所有我认为可能遇到的技术面试问题。所有问题及其答案均是我个人学习后查阅资料总结,每个回答都做了仔细的分析,在嵌入式及其驱动面试相关问题解析做到全网独一无二。学习或者转行到嵌入式、驱动开发领域学习的不二之选

拉依达不拉跨的博客 472

OpenGL 理解VAO VBO 和 IBO

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

正经的时候都在打游戏 1892

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

opengl中VAO,VBO,IBO用法小结

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

游戏人生 2560

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

GLSL-openGL的context与object - VAO、VBO、IBO

openGL的context 在openGL渲染管线中,context保存了当前的渲染状态,在OSG等图形引擎中可能同时有多个线程进行场景渲染,此时便需要有多个图形上下文来保存各个线程的openGL状态。 openGL的object openGL中的另一个重要概念是object,如VAO、VBO、IBO、TBO、FBO等等。这些object中要么存放的是原始数据,如顶点坐标、顶点颜色、纹...

Percypan的博客 779

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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。 IBO为索引缓...

weixin_34125592的博客 147

opengl es VBO IBO VAO学习

opengl es VBO IBO VAOVBO Vertex Buffer Object 其实就是显卡中的显存,可以将要绘制的顶点数据缓存在显存中,从而免去将要绘制的顶点数据重复从CPU发送到GPU, 提高渲染速度。IBO Indices Buffer Object 索引缓冲对象,和VBO一样,只是存储的是索引数组。VAO Vertex Array Object 是一个容器,可以绑定VBO和

keen_zuxwang的博客 941

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

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

weixin_30950237的博客 257

openGL VBO VAO EBO IBO

下面,你会看到一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分。 在这里插入图片描述 渲染管线的东西我就不详细说了,首先我们在openGL绘制图形前,必须先输入一些顶点数据(在OpenGL中我们必须输入NDC坐标,才能可见),然后我们会把它作为输入发送给图形渲染管线的第一个阶段:顶点着色器。它会在GPU创建内存用与储存这些数据,还要要配置OpenGL如何解释这些内存,并且指定其如何发送给显卡,然后顶点着色器就可以处理我们指定的数据了。 那么我们...

u010451780的专栏 275

openGL 提升渲染性能 之 顶点数组 VBO IBO VAO

使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形。 openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引。 直接模式:最简单,最直接的模式,但是性能是最差的,因为每绘制一个基本图元都需要提交一次数据; glBegin(GL_TRIANGLE_STRIP); glColor3ub(255,0...

dcbu70586的博客 243

Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序

OpenGL 学习教程上一篇,我们已经完成了 三角形的渐变色处理。这一章,我们学习 GL3.0 特有的 OpenGL 缓存对象,VBO ,VAO 和 EBO。这一章稍微有点吃理解,建议多看多想。

gowcage的博客 624

三句话讲清VBO,VAO,EBO(IBO)

如题

m0_57236802的博客 561
上一篇: 经纬度坐标与瓦片坐标转换推导
下一篇: Phong反射模型及glsl实现
seeooco
博客等级 码龄6年 188粉丝 54原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seeooco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值