1、我们先了解什么是OpenGL对象(OpenGL Object)

根据OpenGL Wiki的定义:

An OpenGL Object is an OpenGL construct that contains some state. When they are bound to the context, the state that they contain is mapped into the context's state. Thus, changes to context state will be stored in this object, and functions that act on this context state will use the state stored in the object.

我们知道OpenGL对象就是一个包含某些状态的OpenGL结构。而当它们被绑定到上下文环境时,它们的所包含的状态会被映射到上下文的状态。也就是说,对上下文的状态更改会存储到该对象中,并且在这个上下文状态下的函数将使用存储在对象中的状态。

OpenGL被定义为状态机(state machine),大部分API的调用会引起OpenGL的状态发生变化,而OpenGL会使用当前的状态进行渲染。前面所说的上下文,也即是OpenGL的上下文状态。

事实上,OpenGL Object就是封装了一组特定的状态以及相关可以改变其状态的函数。

2、VAO是什么,以及它的作用?

VAO全称Vertext Array Object,意为顶点数组对象,也是一个OpenGL Obejct。它是一个存储了提供顶点数据所需要的所有状态的OpenGL Object。

VAO存储了顶点数据的格式,以及可以提供顶点数据数组的缓存对象VBO。(It stores the format of the vertex data as well as the Buffer Objects providing the vertex data arrays.)

注意VAO并不存储顶点数据,只是记录了顶点相关的状态(譬如顶点位置的格式以及顶点位置的数据、纹理坐标的格式以及纹理坐标的数据)。

作为一个OpenGL Object,VAO也同样有着对应的创建(glGenVertexArrays)、销毁(glDeleteVertexArrays)、以及绑定(glBindVertexArray)函数。

另外一个新创建的VAO默认对于所有属性数组的访问都是disable的,如果要启用需要调用glEnableVertexArribArray,相反则是glDisableVertexAttribArray

(A newly-created VAO has array access disabled for all attributes. Array access is enabled by binding the VAO in question and calling)

顶点属性的值在0到GL_MAX_VERTEX_ATTRIBS-1的范围内。

VAO可以想象为连接顶点属性数组以及VBO中的顶点数据的桥梁。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3、我们先了解什么是Buffer对象(Buffer Object)

根据OpenGL Wiki的定义:

Buffer Objects are OpenGL Objects that store an array of unformatted memory allocated by the OpenGL context (aka: the GPU). These can be used to store vertex data, pixel data retrieved from images or the framebuffer, and a variety of other things.

由此我们可得知,Buffer Object也是一种OpenGL Object,但它是指由OpenGl分配的内存区域,用来存储顶点数据、从图像或者帧缓存(framebuffer)取得的像素数据以及其他数据。

4、VBO是什么,以及它的作用?

VBO全称是Vertext Buffer Object,是用来存储顶点数组数据的缓存对象。

-----------------------------------------------------------------------

注意:The GL_ARRAY_BUFFER binding is NOT part of the VAO's state! 也就是说绑定到GL_ARRAY_BUFFER的类型不会影响到VAO的状态,

之后需要调用glVertexAttribPointer才会真正影响到VAO的状态。

譬如下面代码:

glBindBuffer(GL_ARRAY_BUFFER, buf1);// buf1被绑定到GL_ARRAY_BUFFER类型的缓存
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);// 顶点属性索引0从buf1获得它的顶点数组​
glBindBuffer(GL_ARRAY_BUFFER, 0);// OpenGL不再绑定之前的GL_ARRAY_BUFFER类型缓存

那么这样之后,顶点属性索引0与buf1之间如何联系呢?

我们可以这么想,glBindBuffer设置了一个全局的变量,之后glVertexAttribPointer读取了该全局变量并且将它存入VAO中。

所以改变了绑定的缓存对象之后,并不会影响到VAO里的变量。事实上,OpenGL就是这么工作的。

把顶点属性索引index和缓存buffer联系起来的正是glVertexAttribPointer。这也是为什么GL_ARRAY_BUFFER不是VAO的状态的原因(This is also why GL_ARRAY_BUFFER is not VAO state)

但是注意如果当前是0绑定到GL_ARRAY_BUFFER时,调用glVertexAttribPointer会产生error。

 

2015.7.26

    广州

【OpenGL】VAO与VBO的更多相关文章

  1. Opengl ES之VBO和VAO

    前言 本文主要介绍了什么是VBO/VAO,为什么需要使用VBO/VAO以及如何使用VBO和VAO. VBO 什么是VBO VBO(vertex Buffer Object):顶点缓冲对象.是在显卡存储 ...

  2. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

  3. 几张图看明白VAO、VBO、EBO的关系和代码顺序

    0.详细教程可看https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/ 1.可以简单地认为VAO的 ...

  4. OpenGL 4.0 GLSL 基础教程概览——VAO和VBO常用操作接口

    (一) OpenGL  4.3 最新渲染管线图 从OpenGL 2.0 到 OpenGL 3.0变化非常大,但从OpenGL 3.0 到OpenGL 4.0 变化不是太大. 着色器程序直接运行在GPU ...

  5. (Python OpenGL)【 0】关于VAO和VBO以及OpenGL新特性

    (Python OpenGL)关于新版OpenGL需要了解的: 随着OpenGL状态和固定管线模式的移除,我们不在用任何glEnable函数调用,而且也不会有glVertex.glColor等函数调用 ...

  6. OpenGL VAO, VBO 使用简介

    参照代码样例: // This function takes in a vertex, color, index and type array // And does the initializati ...

  7. OpenGL(二十四) VAO、VBO和着色器使用示例

    1. 新建一个工程,新建一个头文件Shader.h,内容如下: #ifndef _SHADER_H_ #define _SHADER_H_ #include <vector> #inclu ...

  8. opengl VAO ,VBO

    A Vertex Array Object (VAO) is an object which contains one or more Vertex Buffer Objects and is des ...

  9. 图形渲染的大致过程和关于OpenGL渲染管线的一些零碎知识,openglpipeline,vao,vbo,ebo.

    重要!!! OpenGL新人一枚,希望可以再此和大家分享有用的知识,少走弯路 文章会定期更新,把前面几段已经整理过的知识更完后,接下来每周至少会更两次. 文章如果有不对的,理解错误的地方,也非常希望在 ...

随机推荐

  1. LCD底层驱动分析

    根据分析的框架,自己写一个LCD驱动程序 1分析LCD硬件原理图 Von和Voff接的是一个电源电路,通过LCD_POWER接的是GPG4来控制LCD电源,高电平表示开启LCD电源 VM接的是CPU的 ...

  2. Lightoj 题目1422 - Halloween Costumes(区间DP)

    1422 - Halloween Costumes   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  3. HTML DOM

    1.DOM方法 常用 getElementById()  返回带有指定 ID 的元素 getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组) ge ...

  4. Windows Phone开发需要了解的背景

    在Windows Phone8.1之前,Windows Phone应用是基于Silverlight的,这些代码也不能在Windows上运行,从Windows Phone8.1开始,开发者多了一个选择, ...

  5. 5-26课堂作业——组员投票Alpha版存在的问题

    我们在课上讨论了Alpha版目前发现的问题,并通过投票的方式,选出其中三个认为是当前须紧要解决的问题. 问题: 1.缺少数据库: 2.用户体验不良好,游戏难度分区不明显: 3.团队成员共同工作时间少.

  6. Math.abs(~2018),掌握规律即可!

    Math.abs(~2018) 某前端群的入门问题长姿势了,一个简单的入门问题却引发了我的思考,深深的体会到自己在学习前端技术的同时忽略遗忘了一些计算机的基础知识. 对于 JS Math对象没什么可说 ...

  7. fushioncharts 使用教程要点---使用JSON数据方式

    1.建立图表步骤: A.下载fushionChart,引入FusionCharts.js和FusionChartsExportComponent.js文件 B.建立图表对象 var chart1 =  ...

  8. GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包

    0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持 ...

  9. sass/less/stylus css编译

    早上来了听一同事说stylus如何才能编译成css文件,瞬时间有点蒙,一听感觉和less是差不多的功能,随着就上网去查,然后发现这个文章,介绍了这三种sass/less/stylus的安装和语法,贴在 ...

  10. JavaScript数据属性与访问器属性

    ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...