12_添加边缘光
添加边缘光
ForwardShader新增参数
对应是皮肤ID,屏幕空间边缘光宽度、阈值、衰减强度、亮度,太阳光光颜色,边缘光染色 
创建边缘光Shader

输入参数处理
法线,灯光向量和ShadowAttenuation以及屏幕空间参数
IsSkin计算和金属度
PBR参数直接拉过来就行
阳光颜色以及边缘光染色和之前操作一样,使用MatID进行判断输出 
相关参数计算
背光衰减
因为边缘光是根据视线方向和灯光方向来控制的,比如说背光的时候边缘光会很强,而面光面就比较弱。所以先计算LOV 这里对(-LOV)进行了重映射,映射到0~1,这里注意是(-LOV),因为LOV根据点乘特征同向为一反向为-1,所以面光面为1,背光面为-1,而边缘光应该以背光面为主,所以取(-LOV)计算,得到viewAttenuation
这里得到viewAttenuation后还做了额外的处理,先进行平方后在乘0.5和加0.5,相当于平滑过渡,同时也是为了面光面也有边缘光为0.5,不为0,下面的函数图可以更好理解 
法线垂直方向衰减
UE是Z轴向上,所以这里取法线的Z方向,也就是垂直的方向,重映射到0~1。对皮肤和服装部分进行区分,让服装的强度低一点直接进行平方,最后整体进行平滑处理 
兰伯特方向衰减
其实就光源对于模型的衰减,也适用于边缘光。这里因为之前计算过投影,所以也追加进去 
菲涅尔衰减
这一步是真正求边缘光的步骤,一般边缘光都是通过菲涅尔进行计算。因为这里需要对相机距离进行反馈,所以先计算相机距离,这里相机距离有现成的节点直接用
对皮肤进行判断,皮肤的菲涅尔效果应该比衣服更弱,所以被(1-NOV)减去的值应该更多,然后衰减程度也和相机距离相关,min(1, cameraDistance / 12.0)最大值为1,当相机距离为12米时为最大,这里12.0就是相机距离,综合起来看就是随距离越远,菲涅尔强度略微增强(其实肉眼看不太出来) 
相机距离衰减
这里相当于5m之后开始逐渐衰减,5m之前不变,因为小于5的时候减去的部分是负数进行钳制就会变成0

背光外围向中心方向衰减

边缘光颜色控制
阳光颜色混色
皮肤只混合灰度,而非皮肤混合颜色。这里对阳光强度控制,先对基础颜色进行压制将颜色尽量压制到暗部,然后进行不完全的归一化,对暗处提亮,而亮的地方进行压制防止过曝,前面进行压制过后暗处的地方相当于变多了,那么暗部细节就会提亮。这里其实是计算平均整体亮度,但是为了保证有一定明暗关系,所以取了0.7而不是1 最后混合,人物的投影和边缘都受阳光颜色影响染色,其余的则由Albedo负责 
边缘光漫反射和镜面反射
上面边缘光使用提亮过后的漫反射颜色,先提亮在使用平均值进行压暗等处理,下面使用BRDiffuseColor的强度计算得到边缘光的强度 边缘光的镜面反射直接使用PBR镜面反射,使用金属度划分插值边缘光漫反射和镜面反射程度然后整体控制强度,然后乘上上面计算的衰减参数和光源颜色以及边缘光染色就得到边缘光了 
衰减混合
将计算的相关衰减都乘起来就得到了基础的边缘光了
这里基础强度乘了个48
在末尾乘上边缘光的染色,这里的颜色强度也做了控制。
大致曲线是这样,略微平滑提亮
现在边缘光大致就是这样的,为了看着更清楚我又提亮了50倍(不用跟着操作) 
屏幕空间边缘光
得到菲涅尔计算得到的边缘光内部有非常多细节,而屏幕空间计算的边缘没有那么多内部细节所以可以剔除这些不必要的细节 之前提过Blender屏幕空间采样只有GooEngine版本有对应节点,而普通版只有在后期处理做,会比较麻烦
GooEngine方法
这里和计算投影是一个原理,但是使用的法线方向偏移,而Blender这里法线需要重映射,因为读取出来的范围是-1~1。采样偏移的深度图与原深度图进行相减。计算最后就是乘上一个强度系数控制
这里自己调参数 
普通版方法
需要获取深度Z和法线,但这里层级里面的是世界空间的法线,我们需要屏幕空间法线,而后期处理里面不能转换,所以需要自己在材质中处理
材质中转换之后使用AOV输出
层级面版中需要声明,名字保持一致 
现在后期里面就有这个输出了
计算方法和GooEngine是一样的,但是有些差异 后期里面的归一化只有1维的,所以归一化只能自己手动写。归一化就是向量各个分量除以向量的模
法线直接对XY向量归一化就行了,因为不需要第三个分量计算
各分量乘上宽度在进行透视除法除以深度(GooEngine计算不需要透视除法),最后合并成向量就得到了偏移量了
剩下就是计算深度差值了,后期里面是直接使用置换节点控制
差不多就这样子,参数自己随便调。 
最终混合
两种高光直接乘法混合输出,普通版Blender就需要将菲涅尔计算的高光AOV输出到后期进行混合
最外层输出边缘光直接加法加上去就行 
当前效果
有一点点效果就行了,参数自己随便调,我这的GooEngine参数是下面这个,颜色随便给灰度就行

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