Unity 使用Fresnel Effect实现边缘光

转载注明出处:点击打开链接

这篇文章主要讲述在ShaderGraph中FresnelEffect节点在3d视觉效果中的常见使用场景。

  1. 用于一些光滑程度较高的物体判断物体表面反射的强度,例如延伸的湖面,我们会感觉到脚下的水面是能看清楚折射出来的水底的内容,而远处的水面更多反射了天空的颜色。
  2. 用于实现角色或者一些特效的边缘光效果,这个效果通常和Bloom(泛光)后处理特效结合使用,能够产生一些炫酷的效果。
Unity 使用Fresnel Effect实现边缘光使用了菲涅尔反射的水面,图片选自http://gad.qq.com/article/detail/21855Unity 使用Fresnel Effect实现边缘光角色造型的边缘光

我们先来看一下FresnelEffect这个节点所包含的参数,以及这些参数的意义。

Unity 使用Fresnel Effect实现边缘光FresnelEffect节点

Fresnel节点包含了三个输入,分别是表面法线的方向,表面视角的方向以及一个浮点数。计算公式如下Out = pow((1.0 - saturate(dot(normalize(Normal), normalize(ViewDir)))), Power)

Unity 使用Fresnel Effect实现边缘光表面view和normal的方向示意图

这个公式可以看出来,随着法线和视角方向夹角的增大,我们得到的结果也是越来越大的,这样我们容易得到一个渐变的材质。因此对于一个球形的模型,应用了FresnelEffect的效果就是看上去变成了一个渐变的空心圆形。所有边界上的点都趋向于view与normal夹角为90°,中心的夹角趋向0°。在结合一个指数函数,放大渐变的效果。

Unity 使用Fresnel Effect实现边缘光球形模型的FresnelEffect

对于一个复杂的网格,得到的效果也是类似的。就如同我们的角色造型一样。

Unity 使用Fresnel Effect实现边缘光

那么下面我们就可以尝试将这样一个边缘光效果加到我们实际的角色渲染上了。

首先,创建一个FresnelNode并且直接连接到输出中,初步调整一下指数的值。

Unity 使用Fresnel Effect实现边缘光Power = 1.0Unity 使用Fresnel Effect实现边缘光power = 2.0

我们选取一个比较合适的值,暂且认为是2.0。

创建一个颜色属性,用来控制边缘光的颜色,作用在FresnelEffect的结果上。

Unity 使用Fresnel Effect实现边缘光

对DiffuseMap进行采样,得到正常的输出。

Unity 使用Fresnel Effect实现边缘光

将边缘光的结果和正常采样的结果进行相加处理,得到带边缘光的效果。

Unity 使用Fresnel Effect实现边缘光

最后再适当调整FresnelEffect的power值,来得到一个比较好的效果。

Unity 使用Fresnel Effect实现边缘光