11_添加边缘光

添加边缘光

参数新增

分别对应太阳光颜色和边缘光的染色

相关参数计算

皮肤划分

皮肤区域判断,这里需要注意输入的X,Y是反着的,表示0.01>SkinID-MatID就返回1,反之返回0

背光衰减

因为边缘光是根据视线方向和灯光方向来控制的,比如说背光的时候边缘光会很强,而面光面就比较弱。所以先计算LOV 这里对(-LOV)进行了重映射,映射到0~1,这里注意是(-LOV),因为LOV根据点乘特征同向为一反向为-1,所以面光面为1,背光面为-1,而边缘光应该以背光面为主,所以取(-LOV)计算,得到viewAttenuation 这里得到viewAttenuation后还做了额外的处理,先进行平方后在乘0.5和加0.5,相当于平滑过渡,同时也是为了面光面也有边缘光为0.5,不为0,下面的函数图可以更好理解

法线垂直方向衰减

UE是Z轴向上,所以这里取法线的Z方向,也就是垂直的方向,重映射到0~1。对皮肤和服装部分进行区分,让服装的强度低一点直接进行平方,最后整体进行平滑处理 verticalAttenuation

兰伯特方向衰减

其实就光源对于模型的衰减,也适用于边缘光。这里因为之前计算过投影,所以也追加进去

菲涅尔衰减

这一步是真正求边缘光的步骤,一般边缘光都是通过菲涅尔进行计算。因为这里需要对相机距离进行反馈,所以先计算相机距离,这里相机距离进行单位转换到m所以除以100 对皮肤进行判断,皮肤的菲涅尔效果应该比衣服更弱,所以被(1-NOV)减去的值应该更多,然后衰减程度也和相机距离相关,min(1, cameraDistance / 12.0)最大值为1,当相机距离为12米时为最大,这里12.0就是相机距离,综合起来看就是随距离越远,菲涅尔强度略微增强(其实肉眼看不太出来)

相机距离衰减

这里相当于5m之后开始逐渐衰减,5m之前不变,因为小于5的时候减去的部分是负数进行钳制就会变成0

背光外围向中心方向衰减

边缘光颜色控制

阳光颜色混色

皮肤只混合灰度,而非皮肤混合颜色。这里对阳光强度控制,先对基础颜色进行压制将颜色尽量压制到暗部,然后进行不完全的归一化,这里是对暗处提亮,而亮的地方进行压制防止过曝,前面进行压制过后暗处的地方相当于变多了,那么暗部细节就会提亮。这里其实是计算平均整体亮度,但是为了保证有一定明暗关系,所以取了0.7而不是1 最后混合,人物的投影和边缘都受阳光颜色影响染色,其余的则由Albedo负责

边缘光漫反射

边缘光使用提亮过后的漫反射颜色,先提亮在使用平均值进行压暗等处理

边缘光镜面反射混合

边缘光的镜面反射直接使用PBR镜面反射,使用金属度划分插值边缘光漫反射和镜面反射程度然后整体控制强度,然后乘上上面计算的衰减参数和光源颜色以及边缘光染色就得到边缘光了 最后对边缘光进行强度控制

屏幕空间边缘光

添加了屏幕空间的边缘光,和计算投影是一个原理,采样偏移的深度图与原深度图进行相减。计算最后就是乘上一个强度系数控制 因为边缘光是靠菲涅尔计算的,会有很多内部边缘以及细节,而屏幕空间边缘没有细节但是不会有内部边缘内容所以可以做遮罩混合

最终混合

将计算的屏幕空间边缘和边缘光相乘就得到了最终边缘光了 输出加法混合即可

当前效果


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)
  • # #