【问题标题】:Multiple Vertex Buffers per Mesh每个网格有多个顶点缓冲区
【发布时间】:2011-02-21 05:22:22
【问题描述】:

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

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

有什么想法吗?

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

【问题讨论】:

  • 交叉发布:gamedev.stackexchange.com/questions/8855/… 在此处也添加指向其他问题的链接可能是个好主意。
  • 谢谢,我最初是这样做的,但不确定是否应该这样做,所以我删除了它。我现在会更新它们。

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


【解决方案1】:

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

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

【讨论】:

  • 我理解你的第一点,但是你的意思是渲染批次的最佳大小?
  • 调用 glDrawElements(或 glDrawArrays,但我不建议使用)将绘制的图元数量。在 glDrawElements(mode, count, type, indices) 的情况下,它只是 count 的值。但这真的取决于 OpenGL 的实现和有问题的数据,最优值是多少。你必须尝试一下。
  • 在大多数 OpenGL 应用程序中,每个可见的不同“对象”都有 100 到 3000 个顶点。复杂的模型被分解成多个部分。例如。将一个复杂的角色模型作为一个整体发送几乎没有意义,因为这需要在整个网格上处理所有的骨骼和面部动画着色器。至少在我贡献的游戏中,我们将角色分成了每条腿、每条手臂和双手。头部分为颈部和后脑勺;整个面部区域是一个完整的自己的网格,但不包含眼睛、下巴和舌头,它们是分开动画的。
  • 我想我应该进一步指出,不应该在批次之间切换着色器,而是使用制服更改着色器遵循的代码路径。有人可能认为使用顶点属性也可以做到这一点,但由于属性是针对每个顶点处理的,因此性能损失非常高。在条件分支中使用不使用间接的制服性能要好得多。
【解决方案2】:

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

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

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

【讨论】:

  • 你的第一个解决方案不合适,因为我打算使用 Open GL3 strict。
  • 其实它是openGL,你只使用RAM而不是VRAM。但是正如我所说,您只能为 gl_Vertex 等每个属性设置一个属性指针,因此您不能在单个调用中切换缓冲区,也不能将它们连接成一个。你只能划分你的模型或降低它的细节,或者在这个过程中通常禁用顶点着色器(几何着色器在顶点着色器之后,如果你在这里构建你的模型,你将无法使用顶点着色器)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多