共享顶点在面之间是否值得?

10

我目前正在进行一个WebGL项目,尽管我认为这个问题适用于许多图形API。

让我用一个简单的立方体的例子来说明我的问题。

一个立方体有6个面,每个面有4个顶点,因此总共有24个顶点组成立方体。但是,如果我们在面之间共享顶点,我们可以将总顶点数减少到只有8个。根据我的阅读,这可以节省大量宝贵的GPU内存,特别是在处理复杂模型和场景时。

另一方面,通过在面之间共享顶点,我亲身体验到了其中一些缺点,包括:

  • 复杂的顶点法线计算,因为我们必须找到每个顶点的“平均”法线,考虑到每个面的法线,该顶点是其一部分。

  • 有些顶点仍然必须被复制以“匹配”它们对应的UV坐标。

  • 由于一个顶点可能被许多面共享,因此我们无法使用每个顶点着色来指定不同的颜色。

我所阅读的书非常强调顶点共享以最小化内存使用,因此当我遇到一些顶点共享的缺点时,我不确定顶点着色真的有多可行/有用。作者没有提及顶点共享的任何缺点,因此我想听听大家的意见。那么,顶点共享所产生的内存节省真的很重要吗?

1个回答

8
你提到的缺点确实很现实,尤其是对于具有许多锐利边缘或不同纹理的形状而言。立方体是顶点共享最差的例子,每个顶点有3个不同的法线和可能的纹理坐标。在本质上,共享顶点是几乎不可能的。
但是,想象一些有机的形状,像球、某些动物的身体、汽车、树甚至像沙漠这样简单的东西。这些形状可能需要大量的顶点才能看起来像样,但许多这些顶点在面之间是共享的。它们需要完全相同的法线、纹理坐标和其他内容才能看起来平滑。
此外,第一个缺点并不是非常重要。计算顶点可以在预处理中完成,大多数情况下甚至由建模者完成。这基本上永远不会实时进行,而是以这种格式已有。但是如果需要实时进行,则可以考虑权衡和剖析,但即使在这种情况下,使用几何着色器也可能是一个更可取的解决方案,如果需要视觉保真度。
总之这严重取决于你所做的事情。在一些情况下,由于您提到的原因,顶点共享并不是可行的。但无论如何,在许多许多情况下,它都有潜在地节省大量内存的可能性。

1
谢谢你的回答。我只是假设所有对象在导入时都以完全相同的方式处理,但我想引擎可以修改以处理不同级别的顶点共享。当你提到一个立方体时,你说得很对 - 这就是导致我的问题的形状。因此,如果我要在自己的引擎中实现这个功能,您会建议我添加导入具有可自定义顶点共享级别的对象的功能,以便这些对象(例如立方体)可以正确处理,而更有机的对象则使用高级别的共享? - Armada
1
无疑,顶点共享相对简单,应该在引擎中是可选/可变的。随意共享或不共享任何顶点对于优化内存使用至关重要。 - Invalid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接