05_面部阴影SDF重构
SDF面部阴影
创建插槽获取位置
找到骨骼的头部创建三个插槽
使用局部坐标,调整位置

蓝图获取插槽位置传参给材质
创建宏
找到角色蓝图创建新的宏
获取插槽的位置传出,因为材质中是用线性颜色接收Vector信息所以输出需要转换为linearColor

构造动态材质
创建函数
添加输入网格体组件Skeletal MesheComponent
获取网格体组件所有的材质进行遍历,对材质进行类型判断是否为动态材质,如果是就直接传参,反之先创建动态材质再传参
调用之前创建的宏进行传值 
构造函数中调用
根网格和子网格都进行调用创建动态材质,但构造函数只在物体生成时调用,不能实时更新,所以需要再创建一个更新材质函数 
创建材质更新函数
直接对所有材质进行传值
最后在事件图表进行Tick调用 
材质节点添加
新增对应参数进行接收蓝图传值
计算各方向向量并归一化 
将灯光向量投影到Face面
光向量点乘HeadUp得到lightDir在HeadUP上的投影长度,投影长度乘上HeadUp就得到在lightDir在HeadUP上的投影向量,lightdir减去lightDirProj就获得了从面部到光方向的向量 
计算光向量和面部的角度
将光向量投影到HeadRight方向和-HeadForward方向对应就是水平2维坐标系的X,Y,为了获取光的方向与-HeadForward之间的夹角,通过反正切求出角度再转为弧度值,注意这里不是常规的反正切而是actan2函数,对应上图的话就是左右分两半,从-Forward方向为起点也就是0,向下为末端π,左半为正右半为负。所以函数的输出范围就是-π到π,那么转为弧度就-1到1。如果大于0就1-去这个值,小于零就加1,这样就得到当光线在正面时为0,在背面为1,得到AngelThreshold 
采样SDF图
因为SDF图默认是左面受光,所以需要使用HeadRight与LightDirWSHeadWS点乘的正负判断光照在左还是在右,>0表示在右侧需要将UV的水平方向翻转进行采样,<0在左则不需要

计算AngleAttenuation
对应混合代码

将AngleAttenuation分层然后与ShadowAttenuation混合

最后与BaseAttenuation混合

当前效果

Enjoy Reading This Article?
Here are some more articles you might like to read next: