\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); //绘制目标
}