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:

  • URP - RendererFeature :ScreenSpaceOutline
  • 平滑法线处理 - 八面体映射
  • Lv.3 Unity主线:一个简单的PBRShader
  • 理论支线:直接光漫反射与GGX高光的混合问题
  • 理论支线:PBR - 基于图像的照明( image based lighting-IBL)
  • # #