zoukankan      html  css  js  c++  java
  • OpenGL里的VBO,VAO,EBO的理解

    顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用VBO的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。

    顶点数组对象(Vertex Array Object, VAO)可以像顶点缓冲对象那样被绑定,任何 随后的顶点属性调用 都会储存在这个VAO中。说白了就是缓存glVertexAttribPointer()函数的结果。
    这样的好处就是,当配置顶点属性指针时,你只需要将那些调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。

    索引缓冲对象(Element Buffer Object,EBO,也叫Index Buffer Object,IBO)
    EBO也是一个缓冲,它专门储存索引,OpenGL调用这些顶点的索引来决定该绘制哪个顶点。

    下面记录一下glVertexAttribPointer 函数的图解。

    glVertexAttribPointer(index,size,type,normalized,stride,pointer);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

    • 第一个参数指定我们要配置的顶点属性。对应layout(location = 0)定义了position顶点属性的位置值(Location)。它可以把顶点属性的位置值设置为0。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入0
    • 第二个参数指定顶点属性的大小。顶点属性是一个vec3,它由3个值组成,所以大小是3。
    • 第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
    • 第四个参数定义我们是否希望数据被标准化(Normalize)。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE
    • 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性组之间的间隔(多少字节数)。由于下个组位置数据在3个float之后,我们把步长设置为3 * sizeof(float)。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。一旦我们有更多的顶点属性,我们就必须更小心地定义每个顶点属性之间的间隔。
    • 最后一个参数的类型是void*,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头,所以这里是0。

  • 相关阅读:
    【DWT笔记】基于小波变换的降噪技术
    【DWT笔记】傅里叶变换与小波变换
    Matlab命令——目录操作(windows&Linux)
    【DCT笔记】DCT变换、DCT反变换、分块DCT变换
    JSOI2018 防御网络
    NOI2018 屠龙勇士
    CRT&EXCRT学习笔记
    CF662C Binary Table
    HNOI2017 礼物
    ZJOI2014 力
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/8665426.html
Copyright © 2011-2022 走看看