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

时间:2015-06-09 12:09:25

标签: c++ opengl glsl shader vertex-shader

使用和不使用骨架的网格物体是否应使用不同的着色器?

背景 现在我的着色器被构造为处理带有骷髅的网格物体。每个顶点需要3个骨骼ID ,各自具有骨骼重量。这适用于我希望设置动画的骨架模型,但我觉得无生命网格对于每个传递的顶点都有这么多无用的数据有点过分。

在我看来,我可以为带有骨骼和无生命网格的动画网格使用单独的着色器,或者我可以将单一骨骼骨骼作为单个骨骼传递给缺少骨骼的无生命对象,并将每个顶点绑定到此骨骼。 / p>

哪一个是首选,还是有更好的解决方案?

1 个答案:

答案 0 :(得分:3)

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

  1. 额外顶点数据。对于骨骼重量和指数。通常,这些流(每个)每个顶点4个字节。根据未打样网格所具有的顶点数量,这可能会分配大量额外数据,并且也会流式传输到GPU。
  2. 额外的统一数据。即使在这种情况下仅使用一个蒙皮矩阵并设置为标识,您的着色器对象仍包含您使用的最大蒙皮矩阵数的存储空间。此外,着色器(可能)使用的制服越多,可执行的并行执行就越少。
  3. 额外顶点着色器说明。这包括标准化骨骼权重和插值蒙皮矩阵。它还必须将每个顶点乘以该矩阵。
  4. 由于上述考虑因素,通常应用程序选择为蒙皮和非蒙皮对象分别设置顶点着色器。通常,应用程序将创建多个蒙皮着色器,这些着色器将针对不同的“层级”皮肤质量创建。例如,每个顶点的不同数量的可能骨骼,或者蒙皮矩阵的总数。但是,做出这些决定的唯一方法是分析您的应用程序。

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