vao, vbo的一点拙见
时间:2021-08-30
本文章向大家介绍vao, vbo的一点拙见,主要包括vao, vbo的一点拙见使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
vao 是vertex array object, 从名字上看,是顶点数组的对象
其创建是glGenVertexArrays(1, &mTriangleVao); 这样的方式创建的
vbo 是 vertex buffer object, 其是具体数据(buffer)的对象,
通过glGenBuffers(1, &mPosVbo) 类似这样的方式创建
vbo是绑在vao上的,一个vao可以绑定多个vbo
比如,为一个三角形创建一个vao, 然后为这个vao绑定具体的vbo,
一个vbo负责存储顶点数据,一个vbo存储颜色数据
glGenVertexArrays(1, &mTriangleVao); glBindVertexArray(mTriangleVao); glGenBuffers(1, &mPosVbo); glBindBuffer(GL_ARRAY_BUFFER, mPosVbo); glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW); glVertexAttribPointer(m_posAttr, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray(m_posAttr); glGenBuffers(1, &mColVbo); glBindBuffer(GL_ARRAY_BUFFER, mColVbo); glBufferData(GL_ARRAY_BUFFER,sizeof(colors), colors, GL_STATIC_DRAW); glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glEnableVertexAttribArray(m_colAttr); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0);
这么搞的好处在于,我们在每一帧去draw的时候:
使用vao就可以直接绑定 vao 就行
glBindVertexArray(mTriangleVao); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0);
否则,就要按照以往的那种做法,非常麻烦,而且会有性能问题,因为这样会导致CPU不断的向GPU同步数据
glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, colors); glEnableVertexAttribArray(m_posAttr); glEnableVertexAttribArray(m_colAttr); glDrawArrays(GL_TRIANGLES, 0, 3);//0是顶点数组的起始索引,3是我们打算绘制多少个顶点 glDisableVertexAttribArray(m_colAttr); glDisableVertexAttribArray(m_posAttr);
update @ 2021.8.30
原文地址:https://www.cnblogs.com/Arnold-Zhang/p/15207309.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数组及字符串相关知识
- C++循环结构
- C++条件分支结构
- USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
- 数学--数论--HDU--5878 Count Two Three 2016 ACM/ICPC Asia Regional Qingdao Online 1001
- ACM-ICPC 2019 山东省省赛D Game on a Graph
- 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
- 数学--数论--Alice and Bob (CodeForces - 346A )推导
- ACM-ICPC 2019 山东省省赛 M Sekiro
- 数学--数论--HDU2136 Largest prime factor 线性筛法变形
- ACM-ICPC 2019 山东省省赛 C Wandering Robot
- 数据库SQL语言从入门到精通--Part 2--MySQL安装
- ACM-ICPC 2019 山东省省赛 A Calandar
- POJ 1845-Sumdiv(厉害了这个题)
- 数据库SQL语言从入门到精通--Part 1--SQL语言概述