• VAO VBO EBO(2)


    本篇blog讲的是VAO,想看VBO参照上一篇blog。


    VAO(vertex array object,顶点数组对象),不得不说......这个名字起得真是鬼畜,名字和功能八竿子打不着。

    吐槽归吐槽,该写还是要写的。

    我们知道,VBO保存了一个模型的顶点属性信息,每次绘制模型之前我们需要绑定所有的这些信息,对于单个模型来说,这个操作本身无可厚非,但是,当绘制量很大且有大量重复的时候,这样的操作就会变得很麻烦。为了解决这个问题,引入了VAO。VAO可以把所有的配置以及绘制操作都存储在一个对象中,当需要绘制重复的图形的时候,就可以直接把VAO拿出来。(VAO保存了很多的属性(0-15共16个),可以说一个VAO囊括了多个VBO)。

    //generate
    unsigned int vaoID;
    glGenVertexArrays(1, &vaoID);
    
    //bind
    glBindVertexArray(vaoID);

    执行了VAO绑定之后,其后所有绑定的VBO配置都会是VAO对象的一部分。

    下面给出完整的操作代码

    // ..:: 初始化代码(只运行一次 (除非你的物体频繁改变)) :: ..
    // 1. 绑定VAO
    glBindVertexArray(vaoID);
    // 2. 把顶点数组复制到缓冲中供OpenGL使用
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    // 3. 设置顶点属性指针
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    
    [...]
    
    // ..:: 绘制代码(渲染循环中) :: ..
    // 4. 绘制物体
    glUseProgram(shaderProgram);
    glBindVertexArray(vaoID);
    someOpenGLFunctionThatDrawsOurTriangle();

    这样子就搞定了,重复物体用一个VAO,多个物体用多个VAO。(至于说一个VAO绑定多个VBO,那些VBO都是针对一个物体的属性集)

    PS:需要注意的一个点,使用完了一个VAO对象之后,为了安全性保证,要解绑VAO对象,如下:

    glBindVertexArray(0);
    原来人类的悲欢并不相通, 我只觉得他们吵闹。
  • 相关阅读:
    Java中线程池,你真的会用吗?ExecutorService ThreadPoolExcutor
    springcloud中微服务的优雅停机(已验证)
    SpringCloud eureka
    Spring Boot实战:静态资源处理
    你真的理解CountDownLatch与CyclicBarrier使用场景吗?
    Effective.Java第56-66条(规范相关)
    Effective.Java第45-55条(规范相关)
    Effective.Java第34-44条(枚举)
    装饰(Decorator)模式
    合成(Composite)模式
  • 原文地址:https://www.cnblogs.com/zhlabcd/p/11523290.html
Copyright © 2020-2023  润新知