0

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

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

有任何想法吗?

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

4

2 回答 2

1

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

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

于 2011-02-21T11:06:56.190 回答
0

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

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

如前所述,做如此精确的模型相当浪费资源。在大多数 3D 设计师中,您可以使用修改器来获得更少的多边形而不影响视觉效果,您只需选择过于详细的部分。当您想到大多数时候您会看到大约 50% 的模型并且其余部分被测试丢弃时,这也会对性能造成巨大影响。

于 2011-02-21T21:32:45.250 回答