06_面部阴影SDF重构
SDF面部阴影
创建定位点
绑定到骨骼
找到头部的骨骼名称进行指定
对每个定位点指定父级骨骼
调整位置,定位点移到骨骼根部,记得开启吸附
HeadCenter延法线进行移动0.05到骨骼中心
HeadRight除了向上移动0.05,还需要向人物面部的右侧移动0.05 HeadForward除了向上移动0.05,还需要向人物面部的前方移动0.05 位置如下 
创建贴图组
对于面部的SDF图读取,因为要根据灯光信息来决定采样UV的U方向,所以这里直接输出两个,一个的正常一个U反向 
面部材质读取特殊处理
因为面部是特殊的LightMap而且没有材质ID,所以LightMap的位置是空的,刚好这里可以利用起来,直接用空出的槽位读取 
创建解析Light的组
因为只有面部使用所以需要区域判断,还有灯光向量也需要输入 
计算灯光在面部的投影
这里解释一下project节点就相当于AB向量点乘得到的B在A上的投影距离再乘上A,在用光向量减去这个投影向量就可以得到面到光源的一个向量 
计算光向量与面部的夹角
A为面部到光源的向量,B和C为A在面部的前方向的负向量和右向量上面的投影长度,这里可以想象BC构成一个水平的坐标系,A是照射上面是斜着的,根据三角函数可以求出Tangent正切,在通过反正切函数得到角度
注意这里不是常规的反正切而是actan2函数,对应上图的话就是左右分两半,从-Forward方向为起点也就是0,向下为末端π,左半为正右半为负。所以函数的输出范围就是-π到π,那么转为弧度就-1到1。如果大于0就1-去这个值,小于零就加1,这样就得到当光线在正面时为0,在背面为1 
根据光源方向翻转UV方向
光源投影向量与右向量点乘,大于0就表示在右侧需要翻转UV的U反向采样,反之则不需要。因为贴图是默认是光线在左

根据区域来控制是否使用
分通道输出,仅在材质域为面部的时候输出,反之输出0即可
到这里解析贴图数据节点完成 
混合之前的着色层级
找到AlbedoShader添加输入

SDF分层
看节点费劲可以看这个代码去连
在AlbedoShader内部创建新组进行数据处理
内部处理节点
计算angleAttenuation,这里计算方式应该是设计好的,具体怎么设计的不清楚,现在就已经成功得到SDF了,但还需要对投影进行混合
分层
混合输出,这里算法太复杂,我也不清楚为什么这样计算
最后在将输出和BaseAttenuation进行混合,使用AngelMask作为混合因子 
当前效果

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