一. 水的焦散
焦散(Caustic),是一种光学现象,是由于光线在曲面经过反射或折射后形成的聚光效果,类似于凸透镜效果。
对于不透明物体来说,当光线照射到具有强反射属性的曲面对象时,会形成反射焦散现象;而当光线照射到透明物体时,如流动的水或玻璃杯,通过折射后形成聚光的折射焦散现象。
同理,对于水体来说,焦散效果不是在水面产生。一部分光线在水表面发生折射,穿透水面在水底形成折射焦散。另一部分光线被水面反射,可以在墙壁等平面形成反射焦散。
本章内容主要介绍了从美学的角度出发,来实时渲染水下的折射焦散的方法。
二. 原理与实现
光线入水后发生一次折射后继续前进,随着入水深度的增减,光强度逐渐减弱。最后,一部分光子经过不同路径,碰到了海底相同的区域并将其照亮,形成明亮的光斑,类似于凸透镜的聚光现象。无论是基于光线追踪还是逆向光线追踪的方法来实现,都非常的费时,因为只有极小部分的计算对最终结果有实际意义。
为了方便计算焦散,大胆假设:
1. 我们是在赤道上计算正午的水面焦散,这意味着太阳处于头顶正上方;
2. 对焦散效果做出贡献的光线与海底垂直。
(光线从入水到碰到海底,传播距离最短的光线,才容易形成焦散,其余的被介质吸收化成热量发散)
具体实现步骤分为两步:
1. 绘制海底底面:
a. 假设有一道垂直于该顶点的折射光线;
b. 找到该折射光线与水面的交点;
c. 计算交点的法向量
d. 逆向使用斯涅尔定律(Shell)计算入射光线;
(书中代码并没有计算入射光线,而是使用了水面顶点法线方向和水面顶点与水底的距离做为采样坐标)
d. 使用入射光线作为纹理坐标对"太阳"贴图采样,采样结果为焦散的强度;
2. 渲染水表面。
代码如下,首先是申明两个Pass,分别绘制了海底和水面&#