S03E07:光线折射

1,155 阅读1分钟

说明

在 3D 中,当光线遇到透明物体时,会发生穿透,同时发生折射现象。折射又是如何计算的呢?

几何

根据斯涅尔定律(Snell's law),介质折射率和正弦的乘积一定相等。

具体公式推导见这里反射向量和折射向量的推导 - CJT的文章 - 知乎

代码

同反射一样,自带的计算光线折射的函数也在系统 simd 框架下。同时,在说明中也强调了法线是单位向量,eta 是介质折射率的比值。如有需要可直接调用。

//Returns the refraction direction of an incident vector, a unit normal vector, and an index of refraction eta.
func simd_refract(_ __x: simd_float3, _ __n: simd_float3, _ __eta: Float) -> simd_float3