gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:45 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

关于c++ - 有和没有骨架的网格应该使用不同的着色器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30731649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com