Arrays 将缓冲区相加为一个缓冲区

Arrays 将缓冲区相加为一个缓冲区,arrays,pointers,opengl,vertex,vertex-buffer,Arrays,Pointers,Opengl,Vertex,Vertex Buffer,我有一个由几个条目组成的网格。 每个条目都包含它自己的面、顶点、法线、颜色和纹理坐标列表 我是否可以循环遍历所有条目并使用glvertexattributepointer在单个缓冲区对象中累积属性数据,如下所示: glBindBuffer(vbo); for(Entry* e : entries) { glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, e->vertices); ... } 换句话说,对缓冲区vbo的属性

我有一个由几个条目组成的网格。 每个条目都包含它自己的面、顶点、法线、颜色和纹理坐标列表

我是否可以循环遍历所有条目并使用
glvertexattributepointer
在单个缓冲区对象中累积属性数据,如下所示:

glBindBuffer(vbo);
for(Entry* e : entries) {
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, e->vertices);
    ...
}
换句话说,对缓冲区
vbo
的属性
0
重复调用
glvertexattributepointer
是否会重写之前指向的数据


如果是,在对整个缓冲区只调用一次
glvertexattributepointer
之前,将所有顶点复制到一个连续的内存块是否有任何有效的解决方案?

glvertexattributepointer只存储(对于每个属性)您提供给它的最后信息。因此,这种方法不可能附加缓冲区

当你遇到这样的情况时,你有两种选择:

  • 为每个缓冲区发出一个单独的draw调用
  • 将所有缓冲区中的数据复制到单个缓冲区中,并对其发出一个draw调用。请注意,在这种情况下,可能必须调整索引以指向组合缓冲区中的正确位置

  • GLVertexAttributePointer只存储(对于每个属性)您提供给它的最后一个信息。因此,这种方法不可能附加缓冲区

    当你遇到这样的情况时,你有两种选择:

  • 为每个缓冲区发出一个单独的draw调用
  • 将所有缓冲区中的数据复制到单个缓冲区中,并对其发出一个draw调用。请注意,在这种情况下,可能必须调整索引以指向组合缓冲区中的正确位置

  • glvertexattributepointer()
    不复制任何内容。它仅设置指定从何处提取顶点数据的状态。如果为同一属性重复调用,则每次调用都将替换上一个状态,最后一个将获胜

    从OpenGL 3.1开始,有一个
    glCopyBufferSubData()
    call(),允许您将数据从一个缓冲区复制到另一个缓冲区。使用此方法,可以为所有顶点分配一个具有足够空间的缓冲区,然后将较小的缓冲区复制到包含所有顶点的缓冲区中

    尽管如此,以这种方式使用它听起来并不是一个好主意。如果希望所有顶点都位于同一缓冲区中,则从一开始就将它们存储在该缓冲区中会更容易、更高效


    绝对不应该在每次绘制调用时复制顶点周围的数据。虽然减少绘制调用的数量是可取的,但围绕顶点复制数据的成本要高得多。

    glvertexattributepointer()
    不会复制任何内容。它仅设置指定从何处提取顶点数据的状态。如果为同一属性重复调用,则每次调用都将替换上一个状态,最后一个将获胜

    从OpenGL 3.1开始,有一个
    glCopyBufferSubData()
    call(),允许您将数据从一个缓冲区复制到另一个缓冲区。使用此方法,可以为所有顶点分配一个具有足够空间的缓冲区,然后将较小的缓冲区复制到包含所有顶点的缓冲区中

    尽管如此,以这种方式使用它听起来并不是一个好主意。如果希望所有顶点都位于同一缓冲区中,则从一开始就将它们存储在该缓冲区中会更容易、更高效


    绝对不应该在每次绘制调用时复制顶点周围的数据。虽然减少绘制调用的数量是可取的,但围绕顶点复制数据的成本要高得多。。。我就是这么想的。我必须重新加载整个网格。TStill,谢谢!隐马尔可夫模型。。。我就是这么想的。我必须重新加载整个网格。TStill,谢谢!谢谢你的澄清。我最终重写了它,所以它将所有内容都存储在一个缓冲区中。感谢您的澄清。我最终重写了它,所以它将所有内容都存储在一个缓冲区中。