我正在使用 WebGL 进行硬件蒙皮,但是更新我的模型节点层次结构会对性能造成巨大影响。
每个节点都需要查询其当前的位置/旋转/缩放关键帧,用它们构造一个局部矩阵,如果有父节点,则将其与父节点的世界矩阵相乘。
矩阵数学本身已尽可能优化(基于 gl-matrix 的矩阵构造的特殊变体)。
尽管如此,如果我更新许多模型,每个模型都有数十个节点(有些甚至有数百个,可悲的是),这会占用浏览器的所有执行时间。
当节点实际上不需要更新时,我尝试使用脏状态,但只需检查它们的本地数据是否更改(主要是检查位置或旋转是否更改)实际上会导致与计算矩阵相同的处理量。
WebCL 本来是理想的,但自 2014 年以来这似乎无处可去。
我开始考虑在着色器中运行它,但我不能完全理解如何设计它(例如存储关键帧,它是帧->数据的映射,或者如何写回数据)。
另一种方法是将所有动画变换缓存在纹理中,但这不能很好地缩放。对于关键帧数量足够少的模型,这是可以的,但对于动画较长的模型,这会很快变成数百兆字节。这主要是因为我想不出任何存储稀疏数据的方法。如果可能的话,那么我可以存储与关键帧相同数量的变换,这不会占用大量内存(现在,我存储每一帧的变换)。当然,这需要进行矩阵插值,我不确定这有多可靠。
有没有人有任何想法?