1.定义:
顶点数组对象是一种OpenGL对象,它存储提供顶点数据所需的所有状态。VAO仅引用缓冲区。
2.具有的功能:
作为OpenGL对象,VAO具有通常的创建,销毁和绑定功能:glVertexArrays,
glDeleteVertexArrays和glBindVertexArray(VAO只有一个目标)。
引用:Vertex Specification - OpenGL Wiki
顶点属性的编号从0到GL_MAX_VERTEX_ATTRIBS-1。可以启用或禁用每个属性以进行数组访问。当属性的数组访问被禁用时,顶点着色器对该属性的任何读取都将产生一个常量值。
新创建的VAO禁用了所有属性的数组访问。需要通过绑定相关的VAO并调用来启用数组访问。glEnableVertexAttribArray(GLunit index)
ps:调用这些函数时必须绑定VAO,并由这些函数引起的任何更改都将被VAO捕获。
3.VAO记录了
1.vertex attribute的格式,由glVertexAttribPointer设置。
2.vertex attribute 对应的VBO的名字,由一对glBindBuffer和glVertexAttribPointer设置。
3.当前绑定的GL_ELEMENT_ARRAY_BUFFER的名字,由glBindBuffer设置。
VAO中并不保存当前绑定的GL_ARRAY_BUFFER,VBO和vertex attribute的绑定是在glVertexAttribPointer中完成的。
4.使用VAO前后对比
原来调用一次drawcall要执行
1.绑定shader
2.绑定vertex buffer
3.指示其layout
4.绑定index buffer
5.调用drawcall
现在变成了
1.绑定shader
2.绑定vertex array
3.调用drawcall
即用vertex array object 包含vertex buffer和layout 这些状态。
5.关键代码
float positions[] = {
-0.5f,-0.5f,
0.5, -0.5f,
0.5f, 0.5f,
-0.5f,0.5f
};
unsigned int indices[] =
{
0,1,2,
2,3,0
};
unsigned int VAO,VBO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, 6 * 2 * sizeof(float), positions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,8,(const void*)0);
unsigned int IBO;
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned int), indices, GL_STATIC_DRAW);
ShaderProgramSource source = ParseShader("res/shaders/Basic.shader");
unsigned int shader = CreateShader(source.VertexSource,source.FragmentSource);
glUseProgram(shader);
while (!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT);
GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT,nullptr));
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteProgram(shader);
glfwTerminate();
return 0;
}
1464

被折叠的 条评论
为什么被折叠?



