zoukankan      html  css  js  c++  java
  • 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);
    原来人类的悲欢并不相通, 我只觉得他们吵闹。
  • 相关阅读:
    easyui struts后台实现tree返回json数据
    jquery扩展方法
    EasyUI tree扩展获取实心节点
    Hibernate之AbstractEntityPersister
    No CurrentSessionContext configured 异常解决
    Dubbo远程调用服务框架原理与示例
    mongodb高级操作及在Java企业级开发中的应用
    Java和MongoDB之Hello World
    Vmware 虚拟的Linux系统如何与宿主主机共享上网
    VM VirtualBox 上安装 CentOs6.4(详细)
  • 原文地址:https://www.cnblogs.com/zhlabcd/p/11523290.html
Copyright © 2011-2022 走看看