之前说反射,现在说折射。
左下角平行光经过棱镜之后,会因为不同波长有不同折射率,被分解成不同光线。
右下角水中的现象是因为聚焦,光线打到海水凹凸不平的表面,会往不同方向折射。对于海底某个点而言,有几率接收不同方向的打过来的光,就像放大镜把光聚在一起,形成条状的样子。但这对渲染是个灾难,Path Tracing 不适合做。
<aside> 💡 给定入射方向和发现,如何算折射?
</aside>
斯涅尔定律,又叫折射定律。
折射和反射一样,都会发生在入射方向和发现形成的平面内。如果定义两个夹角,入射角和折射角,则满足折射率相乘相等的关系:
$$ \eta_{i} \sin \theta_{i}=\eta_{t} \sin \theta_{t} $$
不同的材质可以规定不同的折射率,例如真空是 1。有了折射率和入射角 θi 就可以算出折射方向 θt。φ 和反射一样。
<aside> 💡 钻石折射率是 2.42,折射率高就说明光线进来之后会被折射得非常厉害。折射率非常高,折射的不同程度就会体现出各种各样不同的波长的光,这也是钻石闪闪发光、五颜六色的原因。
</aside>
这样可以直接算出式子来:
$$ \begin{aligned} \eta_{i} \sin \theta_{i} &=\eta_{t} \sin \theta_{t} \\ \cos \theta_{t} &=\sqrt{1-\sin ^{2} \theta_{t}} \\ &=\sqrt{1-\left(\frac{\eta_{i}}{\eta_{t}}\right)^{2} \sin ^{2} \theta_{i}} \\ &=\sqrt{1-\left(\frac{\eta_{i}}{\eta_{t}}\right)^{2}\left(1-\cos ^{2} \theta_{i}\right)} \end{aligned} $$
<aside> 💡 为什么要算折射角的余弦? 只要算余弦,就肯定会算出来一个有意义的实数,如果这个公式得不到有意义的实数,说明折射不可能发生。
</aside>
式子在某些情况下确实没什么意义:
$$ 1-\left(\frac{\eta_{i}}{\eta_{t}}\right)^{2}\left(1-\cos ^{2} \theta_{i}\right)<0 $$
$$ \frac{\eta_{i}}{\eta_{t}}>1 $$
也就是说,当入射的介质折射率大于折射介质的折射率,就可能会发生没有折射的现象,也就是全内反射现象(Total Internal Reflection)。