我目前正在开发一个WebGL项目,虽然我认为这个问题在许多图形API中是通用的。
让我用一个简单的立方体的例子来证明我在问什么。
一个立方体有6个面,每个面有4个顶点,因此总共有24个顶点构成了立方体。但是,如果我们在面之间共享顶点,我们可以将顶点总数减少到只有8。正如我一直在阅读的那样,这可以节省大量宝贵的GPU内存,尤其是在处理复杂的模型和场景时。
另一方面,我亲身经历了在面之间共享顶点的一些缺点。其中包括:
复杂的顶点法线计算,因为我们必须找到平均值'每个顶点的法线,考虑到所述顶点所属的每个面的面法线。
无论如何必须复制一些顶点以匹配'及其相应的UV坐标。
由于顶点可能被许多面共享,因此我们无法使用每个顶点着色为每个面指定不同的颜色。
我一直在阅读的书真正强调了顶点共享对于最小化内存使用的重要性,所以当我遇到顶点共享的一些缺点时,我不确定顶点着色的可行性/有用性,以及作者没有提到顶点共享的任何缺点我想得到你们的意见。那么从顶点着色产生的内存节省真的那么重要吗?
答案 0 :(得分:6)
您命名的缺点确实非常真实,特别是对于具有大量锐边或不同纹理的形状。立方体是顶点共享的最糟糕的例子,每个顶点有3个不同的法线和可能的纹理坐标。共享顶点基本上是不可能的。
然而,想到一些有机形状。像一个球,一些动物的身体,汽车,树木,甚至像沙漠或其他东西一样简单的东西。这些形状可能需要大量的顶点看起来像任何体面,但很多这些顶点在面之间共享。他们需要完全相同的法线,纹理坐标和whatevers才能看起来光滑。此外,第一个缺点并不那么重要。计算顶点可以在预处理中完成,在大多数情况下甚至可以由建模器完成。这基本上没有实时完成,相反,你只是已经有了这种格式。但是,如果它确实需要实时完成,你可以想象这成为一个实际问题,你需要开始考虑权衡和配置文件。但即使这样,它也可以使用几何着色器处理,如果需要视觉保真度,这可能是一个更好的解决方案。
总之,它在很大程度上取决于你正在做什么。在某些情况下,由于您提到的原因,顶点共享并不可行。无论如何,在许多情况下它可以节省大量内存。