🎳

折射

Specular Refraction

之前说反射,现在说折射
notion image
左下角平行光经过棱镜之后,会因为不同波长有不同折射率,被分解成不同光线。
右下角水中的现象是因为聚焦,光线打到海水凹凸不平的表面,会往不同方向折射。对于海底某个点而言,有几率接收不同方向的打过来的光,就像放大镜把光聚在一起,形成条状的样子。但这对渲染是个灾难,Path Tracing 不适合做。
💡
给定入射方向和发现,如何算折射?

Snell’s Law

斯涅尔定律,又叫折射定律。
notion image
折射和反射一样,都会发生在入射方向和发现形成的平面内。如果定义两个夹角,入射角和折射角,则满足折射率相乘相等的关系:
不同的材质可以规定不同的折射率,例如真空是 1。有了折射率和入射角 θi 就可以算出折射方向 θt。φ 和反射一样。
💡
钻石折射率是 2.42,折射率高就说明光线进来之后会被折射得非常厉害。折射率非常高,折射的不同程度就会体现出各种各样不同的波长的光,这也是钻石闪闪发光、五颜六色的原因。
这样可以直接算出式子来:
💡
为什么要算折射角的余弦? 只要算余弦,就肯定会算出来一个有意义的实数,如果这个公式得不到有意义的实数,说明折射不可能发生。
式子在某些情况下确实没什么意义:
也就是说,当入射的介质折射率大于折射介质的折射率,就可能会发生没有折射的现象,也就是全内反射现象(Total Internal Reflection)。
空气到水里肯定不会发生,只可能反过来。反过来就会发生一个现象,叫 Snell’s Window / Circle。

Snell’s Window / Circle

notion image
人在水底往不同方向看,只能看到一个锥形的区域,锥形之外的什么都看不见。
💡
做光线追踪的时候应该就发生过这种现象,没有发生是因为 Trace 的是球,球有对称性质,入射点和出射电也有对称性质,折射进来的光一定可以折射出去。 如果做一个玻璃兔子的光线追踪,有各种各样的形状,光线可以穿进去,可能会在内部发生全内反射,这块是需要检验的。为了把光线追踪做对,很多物理现象都要检验。
BRDF 的 R 是反射,那折射应该叫 BTDF,T 是 Transmit。两者统称起来可以叫 BSDF,S 表示散射。

Fresnel Reflection / Term(菲涅⽿项)

notion image
以不同视角看过去,垂直的往下看很难看到反射,如果平着往前看,桌子反射的很明显。有多少光被反射,和入射光和法线的角度有关系。
💡
一个光打到物体表面,它有部分能量被反射和部分能量被折射,我们可以用菲涅尔项来解释多少能量发生反射和折射。

Fresnel Term (Dielectric 绝缘体, =1.5)

某一个折射率 1.5 绝缘体材质
notion image
如果一根光线几乎和物体法线完全平了 ,那就认为能量会被完全反射掉(红线,90 angle 处 Fresnel Term 为1)。如果光和物体法线是垂直的,更多能量会直接穿过去发生折射,反射的能量低于百分之 5(红线,0 angle 处 Fresnel Term 小于百分之 5)。
另外两条线表示的是极化性质,和光线的波动性有关。光线沿着各个方向才有震动的,极化就是只延某个方向震动,S、P 是两个不同方向,正常我们认为光线基本就是 S 和 P 方向的平均,平常不用管极化现象。
💡
坐车的时候,如果垂直地对窗子看,可以看到外面。如果看前面几排的人的窗户,可以发现基本车内的都反射出来了,例如司机。因为看前面几排的窗户,这个视角的方向基本上跟玻璃平行,跟法线垂直,这样大量的反射就会发生,就像镜子。

Fresnel Term (Conductor 导体)

绝缘体有一种菲涅尔项,导体有另外一种。
notion image
对于金属来说,菲涅尔项和绝缘体就不一样。即使我们垂直看金属,也会反射很多。为什么我们经常用金属做镜子,是因为他们在任何情况下反射率都挺高的,都有大量能量被反射。
💡
不同金属有不同的菲涅尔项,那么菲涅尔项应该怎么算?
Accurate: need to consider polarization 极化
Approximate: Schlick’s approximation 简化方法
简化方法怎么理解?一个曲线就认为是从某个地方开始,然后长到 90° 时是 1,0° 时是某个值,和绝缘体一样。导体也不考虑下降再上升了,就考虑从比如百分之 90 上升到百分之百,最后拟合出一条曲线即可。 同时认为垂直入射的反射率、在 0° 时的反射率的基准反射率 R0 和两个折射率是有关系的(第一个式子),同时考虑他这条曲线要上升到 90° 的时候正好等于 1 (第二个式子)。这样对导体和绝缘体都能近似得非常好。因此得到非常广泛的应用。
💡
折射率是个复数,正常来说不仅要考虑一个 n,还要一个 k,也可以看成一个复数。正常来说不用这么复杂。