zoukankan      html  css  js  c++  java
  • 索引缓冲对象(EBO或IBO )的理解

    索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)

    以一个具体的例子来说明这是个啥东西。

    我之前画过一个四面体,顶点坐标如下:

    static GLfloat vertices[] = {
        1.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 0.0f, 1.0f,
    
        0.0f, 0.0f, 1.0f, 1.0f,
        0.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
    
        1.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f,
    
        1.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f,
    
    };
    

    可以看到真正独立的点就4个而已,但是一个一个三角形的存储,一共会产生8次重复 ,重复就意味着巨大的存储开销和性能的浪费,当我们的模型的三角形更多的时候,这个问题会更加的严重。一个好的解决方案是,我们只存储4个顶点,然后指定绘制顺序,让GPU按照指定的顺序去绘制就可以了。索引绘制(Indexed Drawing 正是我们解决问题的方案)

    首先,我们先要定义(不重复的)顶点,和绘制出矩形所需的索引:

    static GLfloat vertices[] = {
        1.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 1.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 1.0f, 1.0f
    }
    unsigned int indices[] = {
    // 注意索引从0开始!
    0, 1, 2, // 第一个三角形
    0, 2, 3 // 第二个三角形
    0, 1, 3 // 第三个三角形
    1, 2, 3 // 第四个三角形
    };

     下一步我们需要创建索引缓冲对象:

    unsigned int mEBO;
    glGenBuffers(1, &mEBO); 
    

     与VBO类似,我们先绑定EBO然后用glBufferData把索引复制到缓冲里。同样,和VBO类似,我们会把这些函数调用放在绑定和解绑函数调用之间,只不过这次我们把缓冲的类型定义为GL_ELEMENT_ARRAY_BUFFER (vbo的这个地方是GL_ARRAY_BUFFER)

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mEBO);
    giBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices),   indices, GL_STATIC_DRAW );
    

     要注意的是,我们传递了GL_ELEMENT_ARRAY_BUFFER当作缓冲目标。最后一件要做的事是用glDrawElements来替换glDrawArrays函数,来指明我们从索引缓冲渲染。使用glDrawElements时,我们会使用当前绑定的索引缓冲对象中的索引进行绘制:

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mEBO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    

     我们前面说过VAO内绑定了VBO, VAO同样也可以绑定EBO. 这样我们绑定VAO后,内部会自动帮我们绑定到对应的EBO上.

    【需要注意的是:索引的存在只是说帮我们节省了顶点数组的size,减少了很多重复,但是该画的三角形是一个也没少】

  • 相关阅读:
    信号
    13. 罗马数字转整数
    ES6基础-constructor与super
    关于antd-vue动态表单的问题以及解决方案
    (vue)关于在ui框架方法中传入多个参数的解决方案
    ts-4: 类型别名与interface
    ts-3:元组与类型约束
    TS-2:类型注释与类型推断、函数参数的定义与返回类型的定义、对象成员与数组成员的定义方法、类型别名与类别名
    LeetCode 141. 环形链表 | Python
    LeetCode 459. 重复的子字符串 | Python
  • 原文地址:https://www.cnblogs.com/Arnold-Zhang/p/15210826.html
Copyright © 2011-2022 走看看