目的:
解析,改进,批评一个国外免费透明水面Shader,进一步了解Shader背后的物理原理。
参考:
分析:
我将原水面Shader一再简化,从中抽取最主要的部分,忽略细枝末节,并改掉缺陷,指出不足。
简化版:
1.造型
其中,顶点偏移,也就是波的造型,是用贴图制造的,一目了然:
就是一张高度图经过4方向扰动,乘以波高度。然后它再乘上顶点法线在世界坐标系上的Z轴高度,这个莫名奇妙的操作会使得Normal朝上的顶点的波高更加高,而偏的更加低。我认为编者脑子里也不清楚,所以我修改了,直接乘以(0,0,1)。如果你的高度图只有b通道,这个(0,0,1)都不用乘。
2.Fresnel_Function
再观原材质图,你一定会注意到我们的主角,一个叫Fresnel_Function的节点。
UE4这样起名字,也真是大言不惭,一会我们会说到。
这个节点,涉及到一个现象,菲涅尔效应。国外一般不称为效应,搜索Fresnel equations。
现象倒是很简单:
对着玻璃看,越斜着看,它反射越多,越不透明,越像镜子;
正着看,反射越少,就越透明。
我们在生活中常常见到过这种现象:
(我怀疑夏天远方道路反光,也是这个原因)
总之,这是个在各个材质上都很普遍发生的现象,包括水面。
如果说我们之前的不透明水面本质就是镜子,那我们这次的透明水面本质就是玻璃。
真正的Fresnel方程比较复杂,可脱胎于麦克斯韦电磁学方程。
对于透明物体: