Opengl 优化交错VBO

Opengl 优化交错VBO,opengl,vbo,Opengl,Vbo,我希望能正确理解以下内容: 在OpenGL中为顶点、法线和索引创建不同的VBO:s时,由于重复使用,我可以使用更少的内存,但效果不太好 使用交错VBO:s时,通常的例行程序是相同的顶点和法线将被多次写入,对吗 我的问题是,如果人们只是为了提高速度而接受使用更多内存,还是值得使用某种技巧“重用”已给定的具有索引或类似内容的数据?交错VBO基本上包含一系列结构: struct vertexAttr{ GLfloat posX, posY, posZ; GLfloat normX, n

我希望能正确理解以下内容:
在OpenGL中为顶点、法线和索引创建不同的VBO:s时,由于重复使用,我可以使用更少的内存,但效果不太好

使用交错VBO:s时,通常的例行程序是相同的顶点和法线将被多次写入,对吗


我的问题是,如果人们只是为了提高速度而接受使用更多内存,还是值得使用某种技巧“重用”已给定的具有索引或类似内容的数据?

交错VBO基本上包含一系列结构:

struct vertexAttr{
    GLfloat posX, posY, posZ;
    GLfloat normX, normY, normZ;
}

glBindBuffer(GL_ARRAY_BUFFER, vert);
vertexAttr* verts = new vertexAttr[numVerts];
//fill verts
glBuffer(GL_ARRAY_BUFFER, numVerts, verts, GL_STATIC_DRAW​);
delete[] verts;

glBindProgram(prog);
glVertexAttribPointer(posAttr, 3, GL_FLOAT, false, sizeof(vertexAttr), 0);
glVertexAttribPointer(normAttr, 3, GL_FLOAT, false, sizeof(vertexAttr), offsetof(vertexAttr, normX));

您仍然需要为索引使用单独的缓冲区。

使用交错VBO和单独VBO的内存使用情况应该没有区别。例如,如果最初有一个VBO用于位置,一个VBO用于法线,每个VBO有n个元素,那么现在将有一个VBO,位置和法线交替,具有2n个元素,因此总内存使用量不会改变。您是否在询问索引渲染和非索引渲染之间的性能和内存使用差异渲染?无论是否使用交错VBO,每个顶点都必须生成一个离散的顶点属性组合。您的问题似乎暗示,如果使用单独的顶点指针,您可以使用较小的顶点法线集,但法线数组的长度必须与位置相同。也就是说,如果将所有内容打包到交错的VBO中,您可能能够更好地对齐内存。您可以避免在每个单独的属性数组中添加填充,这实际上可以节省内存。您可以将索引存储在同一个缓冲区中。只是没有交错。您可以为顶点数据和索引分配一个具有足够空间的缓冲区,并将其背靠背存储。我不认为这是非常普遍的,但它的工作只是罚款。你知道。。。我从没想过要做那样的事。这很聪明;)这就是说,您必须将缓冲区对象绑定到两个位置才能工作。设置指针时,先到
GL\u数组\u缓冲区
,然后在绘图前到
GL\u元素\u数组\u缓冲区
。所以ratchetfreak的说法有些道理,正如你提到的,它们不必分开。对,你最终将同一个缓冲区绑定到这两个目标。我使用这种方法编写了一些代码,我计划随时开放源代码(一个用现代OpenGL绘制一些常见几何形状的简单库)。我之所以选择它,主要是因为我觉得尝试它会很有趣。我不期望它能带来很大的好处。它确实可能会减少驱动程序中的一些缓冲区映射开销,例如创建缓冲区内存的GPU映射。一个限制是使用标志是共享的。所以顶点数据不能是动态的,索引不能是静态的。