2023-01-01 VAOs和VBOs

1、两者的定义

VAO,即Vertext Array Object,从名称上看就能理解,这是一个数组对象,这个数组对象里包含了一个或多个VBO(Vertext Buffer Object). 它主要的作用就是用来存储渲染一个完整对象的信息,比如渲染一个对象所需的颜色、几何坐标信息等。

VBO,即Vertext Buffer Object,其本质就是一个内存Buffer, 存储在GPU里,内存读写速度快,主要作用是存储坐标,向量,texture坐标等。

2、基于代码理解

   /* 定义一个VAO */
    glGenVertexArrays(1, &vao);

    /*绑定其作为当前使用的对象 */
    glBindVertexArray(vao);

    /*定义两个VBO */
    glGenBuffers(2, vbo);

    /*绑定第0个VBO作为当前active的对象,后面用来存储坐标信息 */
    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);

    /* 从CPU里复制数据到位于GPU的VBO里 */
    /* 8 * sizeof(GLfloat) 是Buffer的大小 */
    glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), data, GL_STATIC_DRAW);

    /*在这里建立VAO和VBO的联系,即VAO里的第0个与当前的VBO绑定,并定义每个坐标由两个数构成  */
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

    /*将其Enable以便其可用 */
    glEnableVertexAttribArray(0);

    /* 绑定第1个VBO作为当前active的对象,后面用来存储颜色信息 */
    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);

    /* 从CPU里复制数据到位于GPU的VBO里 */
    /* 12 * sizeof(GLfloat)是Buffer的大小 */
    glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), colors, GL_STATIC_DRAW);

    /* 在这里建立VAO和VBO的联系,即VAO里的第0个与当前的VBO绑定,并定义每个颜色由三个数构成 */
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);

    /* 将其Enable以便其可用 */
    glEnableVertexAttribArray(1);

    /* -------省略定义Shader的代码----------------*/
    /* 将shaderprograme里用到的变量和VBO 通过index绑定*/
    glBindAttribLocation(shaderprogram, 0, "in_Position");
    glBindAttribLocation(shaderprogram, 1, "in_Color");
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容