VAO介绍
VAO(Vertex Array Object): 顶点数据对象,用于存储一个Mesh网格所有的顶点属性描述信息。
VAO结合SingleBuffer进行构建
void prepareSingleBuffer2()
{
// 1, 准备position的数据和colors的数据
float positions[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
float colors[] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
};
// 2, 使用数据生成两个VBO posVbo colorVbo
GLuint posVbo, colorVbo;
glGenBuffers(1, &posVbo);
glGenBuffers(1, &colorVbo);
glBindBuffer(GL_ARRAY_BUFFER, posVbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorVbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
// 3, 生成VAO并且绑定
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// 4, 分别将位置/颜色属性的描述信息加入VAO中
// 4.1 描述位置属性
glBindBuffer(GL_ARRAY_BUFFER, posVbo); // 只有绑定了posVbo, 下面的属性描述才会与此相关
glEnableVertexAttribArray(0); // 激活0号位
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
// 4.2 描述颜色属性
glBindBuffer(GL_ARRAY_BUFFER, colorVbo); // 只有绑定了colorVbo, 下面的属性描述才会与此相关
glEnableVertexAttribArray(1); // 激活0号位
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
// 解绑VAO
glBindVertexArray(0);
}
VAO 结合InterleavedBuffer策略
void prepareInterleavedBuffer2()
{
// 1 主备好Interleaved数据(位置+颜色)
float vertices[] = {
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 第一个顶点的位置和颜色,前三个数据为顶点数据,后三个为第一个顶点的颜色数据
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 第二个顶点的位置和颜色
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 第三个顶点的位置和颜色
};
// 2 创建唯一的vbo
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 3 创建并绑定vao
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// 4 为vao加入位置和颜色的描述信息
// 4.1 位置描述信息
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
// 5 解绑VAO
glBindVertexArray(0);
}