每个网格有多个顶点缓冲区

时间:2011-02-21 05:22:23

标签: c++ opengl vbo opengl-3 buffer

我遇到了我的网格及其所有顶点和索引的大小大于(最佳)顶点缓冲区对象上限(~8MB)的情况。我想知道我是否可以在多个顶点缓冲区中细分网格,并以某种方式保留索引的有效性。即在第一个顶点有一个指示的三角形,在最后一个顶点有一个指示(即在单独的VBO中)。

一直在顶点阵列对象中保持这一点。 我的想法是,除了我自己的麻烦,对于像这样的网格(混乱:P),只需使用必要的尺寸(> 8MB);这就是我现在所做的。 但理想情况下,我的缓冲管理器(wip)目前正在使用最佳尺寸;那我可能只需要做一个特例。

有什么想法吗?

注意:我也在gamedev stack上交叉发布了这个,因为我不确定哪个更适合(部分是设计问题)。

2 个答案:

答案 0 :(得分:1)

单个模型的8MB顶点数据相当多。我很确定这个模型可以分成单独的网格。分割网格的好地方是锐边,因为沿着这些边的顶点具有不同的法向量,因此不相同且无法共享。

然而,比VBO大小更重要的是传递给glDrawElements(或glDrawArrays)的渲染批次的大小。根据我的经验,在高速缓存压力开始之前,渲染批次的最佳大小在100到2000个三角形之间。但是你应该自己在系统上测量它。

答案 1 :(得分:0)

据我所知,你可以只设置一个glVertexPointer。因此,您可以将此指针设置为您的大数据存储,但这将指向客户端的内存并且没有VBO。如果你不想使用VBO,那么每次只能有一个。

但实际上您可以将所有数据保存为纹理,并使用几何着色器仅从索引重建模型。我的Radeon 3870HD的纹理限制是每个维度8192,但你更有可能使用超过1D纹理耗尽内存(我的卡上512 MB内存和完整的2D RGB纹理大约805 mb)。在几何着色器中,您可以根据支持的索引连接您的顶点并创建网格,但这是一个非常大的解决方法,并不是很实用。

如前所述,做这种精确模型是相当浪费资源的。在大多数3D设计师中,您可以使用修改器来获得更少的多边形而不会影响视觉效果,您只需选择过度详细的部分。当你想到大部分时间你看到大约50%的模型和休息被测试丢弃时,这也是巨大的性能损失。