【OpenGL】VAO与VBO

 

一、咱们先了解什么是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.app

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

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

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

 

二、VAO是什么,以及它的做用?code

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

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

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

 

做为一个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中的顶点数据的桥梁。

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

三、咱们先了解什么是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)取得的像素数据以及其余数据。

 

四、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

    广州

相关文章
相关标签/搜索