Unity引擎制作海面效果
大家好,我是阿赵。
这一篇是说一下菲涅尔水的基本原理。
延续之前的例子,我场景里面有天空盒、小岛和水面。
一、菲涅尔反射原理介绍
从摄像机的角度看去,看不同的海面的点,摄像机和海面形成的夹角会发生变化,下面的图里面的红色箭头不是很准确,但可以大概表达一下角度是怎样变化的。
菲涅尔反射,是由菲涅尔公式推导出来的反射规律,描述了光在不同的折射率的介质之间的行为,简单的说就是反射/折射与视点角度之间的关系。
举个例子,比如你站在水边,低头看脚下的水,应该是看得到水是透明的,还能看得到水底,反射不是特别的强烈。但如果你看往远处的水面,你会发现水并不是透明的,而且反射非常强烈。
明白了这个道理之后,那么接下来就需要计算这个菲涅尔值来控制水的反射强度了。
从刚才原理看,主要是有2个因数,一个是视点,也就是观察的点,另外一个就是角度了。所以站在 同一个点,看不同海面形成的角度,应该产生不同的菲涅尔值,比如这样:
在上面的图中,海面上的白色代表的是反射的强度,离自己近的地方,呈现的是黑色,远处是白色,也就是说明了近处的反射很低,远处的反射很强。
然后把这个作为透明通道使用,会发现出现了这样的效果:
现在就有点类似于刚才我们说的菲涅尔反射的效果了,近处看得到水是透明的,远处水不透明而且反射很强。
二、 具体实现
最简答的菲涅尔模拟计算,其实就是经常听到的计算公式:NDotV
N代表的是世界发现,V代表的是世界空间的观察方向View Dir,把两者进行点乘。点乘的几何含义就是求角度,所以通过发线和观察方向,我们就求出了观察点角度了。用ASE来连线,大概是这样:
最后用1-NDotV,是因为我们需要的效果是黑白相反的。
知道了这个原理之后,接下来的事情就简单了,可以在这个基础上,加上一些别的参数:
比如我这里加上了SmoothStep,用于控制黑白渐变的范围,不同的min和max值,可以控制渐变过渡的效果:
然后最后加上一个总体的透明度控制值,用于控制这个菲涅尔的强度,这样第一步就完成了。接下来第二篇会介绍漫反射颜色和波纹的实现