VAO与VBO

VAO与VBO

本文旨在解释VAO(vertex array object)和VBO(vertex buffer object)的相关概念。

随着OpenGL状态和固定管线模式的移除,我们需要一种新的方式来将数据传输到图形卡以渲染图形。我们可以采用VBO,或者是在OpenGL3以上版本引入的新的特性VAO。我们可以把同一个渲染对象的顶点数据和颜色存储在处于同一个VAO中的不同VBO中。

VAO是包含一个或者多个VBOs的对象,被设计用来存储被完整渲染对象的相关数据信息,如渲染对象的顶点信息和每一个顶点的颜色信息。
VBO是显卡高速显存的缓冲区,用来保存顶点的信息。

以一个单色三角形为例,其可以使用两个VBOs分别存储顶点位置信息和顶点的颜色信息,这两个VBOs处于同一个VAO中。类似的,还可以将法线、纹理或其他信息存储在VBO中。VAO是一个容器,它将所有可以由glVertexAttribPointer和其它一些函数进行设置的状态包装到一起。在使用一个VAO时,通过glVertexAttribPointer调用来指定的状态都会被存储到当前的VAO中。
VAO把对象信息直接存储在图形卡中,而不是在当我们需要的时候传输到图形卡,即Direct3D所采用得方式,而在OpenGL中只有OpenGL3.X以上的版本中采用。这意味着应用程序不用将数据传输到图形卡或者是从图形卡输出,从而获得了额外的性能提升。

VAO, VBO使用方法

1.产生VAO

/* Allocate and assign a Vertex Array Object to our handle */
void glGenVertexArrays(GLsizei n, GLuint *arrays);
n: VAO对象数量, arrays: VAO对象指针

2.绑定VAO

/* Bind Vertex Array Object as the current used object */
void glBindVertexArray(GLuint array);
array: 要绑定数组的名称

3.产生VBOs

void glGenBuffers(GLsizei n, GLuint* buffers);
n: VBO对象数量, buffers: VBO对象指针

4.绑定VBO

void glBindBuffer(GLenum target, GLuint buffer);
target:GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, or GL_PIXEL_UNPACK_BUFFER.

5.给VBO分配数据

void glBufferData( GLenum target, GLsizeiptr size, 
                    const GLvoid * data, GLenum usage);
target: GL_ARRAY_BUFFER(表示顶点数据), GL_ELEMENT_ARRAY_BUFFER(表示索引数据),GL_PIXEL_PACK_BUFFER(表示从OpenGL获取的的像素数据), or GL_PIXEL_UNPACK_BUFFER(表示传递给OpenGL的像素数据)
size:
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值