我们知道现在绝大多数情况下角色动画的蒙皮计算是放在GPU中计算的。
但是仍然有一些特殊的场合我们需要在CPU端使用蒙皮计算的结果,比如涉及到
布料的物理模拟的时候。这时我们需要在CPU端计算蒙皮。
为了节约宝贵的CPU计算的时间,我们需要用SSE对CPU计算蒙皮进行加速。
顶点结构如下:
struct Vertex
{
float3 Pos;
float3 Normal;
int n; //该顶点蒙到了几个骨骼上
int BoneId[4];
float Weight[3];
.... //切线等等
};
对于每个顶点的计算过程是先由BoneId和Weight计算出变换矩阵,然后用矩阵变换
顶点的位置,法线等。其中求变换矩阵是对多个矩阵加权求和的过程,这一步很适合
使用SSE加速。
每个顶点可能蒙到1-4个骨骼上,也就是每个顶点可能需要对1-4个矩阵加权求和。
1个骨骼的时候不用计算。2-4个骨骼的时候,我们分别写3个函数对应这3种情况。
__forceinline void LoadFourFloats(float* a0, __m128& res)
{
res = _mm_load_ps(a0);
}
__forceinline void StoreFourFloats(float* a0, const __m128& src)
{
_mm_store_ps(a0, src);
}
__forceinline void MulMatrixFloat(__m128& mo0, __m128& mo1, __m128& mo2,
const __m128& mi0, const __m128& mi1, const __m128& mi2,
float w)
{
__m128 xmm;
xmm = _mm_load_ss(&w);
xmm = _mm_shuffle_ps(xmm,xmm,0);
// Multiply matrix 1 by weight 1.
mo0 = _mm_mul_ps(xmm, mi0);
mo1 = _mm_mul_ps(xmm, mi1);
mo2 = _mm_mul_ps(xmm, mi2);
}
__forceinline void Collapse2MatSSE(float* pM1, float* pM2,
float W1, float W2, float* pR)
{
__m128 x