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将该缓冲区对象指定为IBOgl.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(); //创建VAOgl.bindVertexArray(vao);//绑定VAOfor(i in vboDataArray){//创建VBOvbo = 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){//创建IBOibo = 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一样的。

vbo,ibo,vao相关推荐

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

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  2. VAO VBO IBO的理解

    VAO & VBO VAO是一个对象,一个VAO可以包含都多个VBO,是一种关联关系 顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何随后的顶 ...

  3. VBO,VAO,,EBO-penGL进阶(二十) - 绘制一个长方形和一个三角形

    简介 先看最终效果 今天要学习的重点是怎样在场景中绘制两个(或者以上的)物体, 方框的绘制 方框其实是由两个三角形组成,看一下VBO, VAO, EBO的定义 GLfloat vertices[] = ...

  4. OpenGL图形渲染管线、VBO、VAO、EBO概念及用例

    OpenGL图形渲染管线.VBO.VAO.EBO概念及用例_牧野的博客-CSDN博客 图形渲染管线(Pipeline) 图形渲染管线指的是对一些原始数据经过一系列的处理变换并最终把这些数据输出到屏幕上 ...

  5. 详解Opengl中VBO和VAO

    详解Opengl的VBO和VAO 前言 什么是VBO 如何创建VBO 什么VAO 如何执行VAO 总结 前言 对于Opengl中的VBO和VAO相信很多人都熟悉这2个名字,但是有时候缺容易混淆2个概念 ...

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

    关于OpenGL利用VBO绘制以及VBO和VAO的关系 前言 VBO VAO 整合 顶点数据 特别注意! 前言 VBO和VAO是OpenGL中非常重要的概念,这里先解释一下是什么意思: 顶点数组对象: ...

  7. OpenGL VBO、VAO、EBO简单例子

    文章目录 VBO使用glDrawArrays()函数画梯形 在上一个例子的基础上改变背景颜色 VBO+VAO使用glDrawArrays()函数画梯形 VBO+VAO+片段着色器给梯形着色 EBO+V ...

  8. 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形

    以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下面的例子是实现绘制一个三角形的简单程序.采用了VBO(veretx buffer object).VAO(vertex ...

  9. OPenGL中的VBO、VAO、EBO作用理解

    VBO是顶点缓冲对象(Vertex Buffer Objects, VBO),包含了顶点的3d坐标和颜色.但它们是按同类数组存储的,存放在一片显存空间中,程序并不知道这些数字哪个代表3d坐标,哪个代表 ...

最新文章

  1. JS实现表格列宽拖动
  2. java基础(二) 自增自减与贪心规则
  3. 给Source Insight做个外挂系列之四--分析“Source Insight”
  4. win10查看pcie设备_壹拓网科技解密WIN10系统使用向日葵开机棒远程开机需要设置几个地方...
  5. 模拟退火与遗传与蚁群算法
  6. python 微信公众号-回调模式验证url
  7. linux 编译程序的四个过程
  8. 如何把HTML背景图片变透明,photoshop怎样把图片背景变透明
  9. mysql front不能上到_mysqlfront不能上到Mysql服务器连接quot;192.168.5.*_MySQL
  10. 微信小程序:we重师
  11. chromecast投屏_利用谷歌Chromecast,3个简单的步骤教你将手机投屏到电视上
  12. 解决雷神笔记本风扇声音太响太吵问题
  13. Go-加密学(四) - 证书/SSL/TLS/https单向认证/思维导图
  14. 集大1513 1514班 软件工程第二次作业评分与点评
  15. RetianNet在DDSM(4)
  16. jsp页面九大隐含对象
  17. 才云 Caicloud 开源 Nirvana:让 API 从对框架的依赖中涅槃重生
  18. blos硬盘启动台式计算机,台式机加硬盘开机问题解决-戴尔台式机bios设置
  19. Linux 网卡操作
  20. python类型对象<class ‘type‘>的理解与探究

热门文章

  1. 工作中可能会使用到的数据结构和算法
  2. Mac idea java 代码的前进后退 代码的撤销和前进快捷键
  3. C# 打印调试信息到DebugView
  4. su [user] 和 su - [user]的区别
  5. 转换率是什么?如何提升转换率(CVR)?
  6. linux ps swn,Linux操作的基本概念与命令(转)
  7. 三天流量有效期具体怎么算_飞猪流量有效期多久?怎么提取?
  8. 毕设必看——Python ttkbootstrap 制作账户注册信息界面
  9. hi3516配置wifi_hi3516上wifi驱动有几率加载失败
  10. Tomcat 部署方式