openGL学习—VAO与VBO

\VAO 

一.概念

顶点数组对象,记录已经配置好的顶点属性,当一个VAO被创建绑定之后,任何随后的顶点属性调用都会储存在这个VAO中。 这样一来如果有多个vBo对象,在渲染绘制时,就不用执行很多次前面提到的渲染程序,只需要执行一次绑定的VAO的渲染API即可。

VAO并不保存实际数据,而是存放顶点结构定义

二.使用

1.创建VAO,即顶点数组对象

unsigned int VAO;
glGenVertexArrays(1, &VAO);

2.绑定VAO

glBindVertexArray(VAO);

VBO

 一.概念

顶点着色器在GPU上创建内存,用于储存顶点数据,而顶点数据通过顶点缓冲对象

(Vertex Buffer Objects VBO)管理

VBO 是用来存储(缓存)一些顶点数据,方便一次性给GPU多分发一些

二.使用

1.首先生成一个VBO对象(缓冲对象)

void glGenBuffers(GLsizei n,GLuint* buffers)

参数一:需要创建的缓存数量     参数二  缓存对象的ID

unsigned int VBO;//声明一个int作为VBO对象的id
glGenBuffers(1, &VBO);//生成一个Buffer对象,id为VBO

2.将缓冲对象绑定,相当于指定缓冲对象的类型

void  glBindBuffer(GLenum target,GLuint buffer)

参数一:告诉VBO缓存对象将保存的是顶点数组数据  / 索引数组数据GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY

参数二:绑定的ID

GL_ARRAY_BUFFER:顶点属性,如顶点坐标,纹理坐标,法线与颜色分量数组

GL_ELEMENT_ARRAY:用于glDraw[Range]Elements()的索引数据

glBindBuffer(GL_ARRAY_BUFFER, VBO);  

3.缓存初始化完毕后将数据拷贝到缓存对象

void  glBufferData(GLenum target,GLsizeiptr size,const GLvoid*data, GLenum usage)

参数一:缓冲类型

参数二:指定传输数据大小 字节为单位

参数三:实际数据

参数四:希望显卡如何管理给定数据,有三种形式

              GL_STATIC_DRAW:数据几乎不会发改变

              GL_DYNAMIC_DRAW:数据会被改变许多

              GL_STREAM_DRAW:数据每次绘制的时候都会被改变

glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

4.告诉显卡如何解析缓冲里的属性值

void glVertexAttribPointer( GLenum index,GLint,GLenum type,

                                           GLboolean normalized,GLsizei stride, const GLvoid *pointer)

参数参考 :

 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

 4.开启VAO管理的第一个属性值

由glEnableVertexAttribArray启用指定属性,才可在顶点着色器中访问逐顶点的属性数据

glEnableVertexAttribArray(0);

5.解绑VAO与VBO

  //解绑
   glBindBuffer(GL_ARRAY_BUFFER,0);
   glBindVertexArray(0);

上述步骤应在初始化函数中,即 initializeGL()

初始化操作完成后即可渲染

如绘制三角形

void AXBOpenGLWidget::paintGL()
{
    glClearColor(0.2f,0.3f,0.3f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);  //颜色缓存

    glBindVertexArray(VAO);  //绑定VAO
    glDrawArrays(GL_TRIANGLES,0,3);  //绘制目标
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值