OpenGL中的VAO相关操作

219 阅读1分钟

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);
}