有和没有骨架的网格应该使用不同的着色器吗?

Should Meshes with and without Skeleton use different Shaders?

有骨架和没有骨架的网格应该使用不同的着色器吗?

背景: 现在我的着色器被构造为处理带有骨架的网格。每个顶点有 3 个 骨骼 ID,以及相应的 骨骼权重 。这对于我希望设置动画的具有骨架的模型效果很好,但我觉得无生命的网格对于每个通过的顶点都有这么多无用的数据有点过分。

如我所见,我可以为带骨骼的动画网格和无生命网格使用单独的着色器,或者我可以将单位矩阵骨骼作为单个骨骼传递给缺少骨架的无生命对象并将每个顶点绑定到该骨骼.

首选哪一个,或者有更好的解决方案吗?

正如您在问题中指出的,这里的主要问题是执行时间和内存。有很多方法可以使用蒙皮(骨架)渲染对象,两者兼而有之:

  1. 额外的顶点数据。对于骨骼重量和指数。通常这些流是(每个)每个顶点 4 个字节。根据未蒙皮网格的顶点数量,这可能会分配大量额外数据,并且还会流式传输到 GPU。
  2. 额外的统一数据。即使在这种情况下您只使用一个蒙皮矩阵,并设置为标识,您的着色器对象仍然包含您使用的最大数量的蒙皮矩阵的存储空间。此外,您的着色器(可能)使用的制服越多,可以发生的并行执行就越少。
  3. 额外的顶点着色器指令。这包括归一化骨骼重量和插值蒙皮矩阵。它还必须将每个顶点乘以该矩阵。

由于上述考虑,应用程序通常选择为蒙皮和非蒙皮对象使用单独的顶点着色器。通常,应用程序会创建多个蒙皮着色器,这些着色器将针对不同的 'tiers' 蒙皮质量创建。例如,每个顶点可能有不同数量的骨骼,或蒙皮矩阵的总数。但是,做出此类决定的唯一方法是分析您的应用程序。

如果性能和内存对您来说不是问题,那么您可以使用现有着色器将非蒙皮对象渲染为蒙皮对象,但是,因为这需要一些工作才能正确设置,所以它可能同样容易创建一个新的非蒙皮着色器。