📜  折光率(1)

📅  最后修改于: 2023-12-03 14:54:36.918000             🧑  作者: Mango

折光率

折光率是光线在从一种介质射向另一种介质时被折射的程度。在同一份介质中,光线传播是沿直线传播,而不会发生偏折。但是当光线穿过介质表面时,会因为速度的变化而发生折射。折光率取决于光线穿过的两种介质,在物理层面上是介质分子的特性。折射定律表明,入射角与折射角的正弦之比等于两种介质的折射率之比。

折光率的表示方式

折光率通常用符号 $n$ 表示,可以由下面公式计算得出:

$$n = \frac{c}{v}$$

  • $n$ - 折光率
  • $c$ - 在真空中的光速
  • $v$ - 在介质中的光速

一般来说,折光率是一个纯数字,没有量纲。不过某些情况下,折光率也被表示为波长或频率的函数。

折光率在计算机图形学中的应用

折光率的应用很广泛,其中之一就是在计算机图形学中的最近点采样(nearest point sampling)算法。在这个算法中,光线和平面相交的时候,需要计算入射角、折射角和反射角。而这些角度的计算都依赖于折光率。

在计算机图形学中,通常使用 Fresnel 方程,它可以计算出表面的透射和反射光强之比,从而实现逼真的材质表面效果。

// 计算反射光强
float Reflectance(float n1, float n2, float k1)
{
    float kr, cosTheta1, cosTheta2, sinTheta2;
    cosTheta1 = fabs(k1);
    sinTheta2 = n1 / n2 * sqrtf(fmax(0.f, 1.f - cosTheta1 * cosTheta1));
    cosTheta2 = sqrtf(fmax(0.f, 1.f - sinTheta2 * sinTheta2));
    if (sinTheta2 >= 1.0f) {
        kr = 1.0f;
    } else {
        float rs = (n2 * cosTheta1 - n1 * cosTheta2) / (n2 * cosTheta1 + n1 * cosTheta2);
        float rp = (n1 * cosTheta1 - n2 * cosTheta2) / (n1 * cosTheta1 + n2 * cosTheta2);
        kr = 0.5f * (rs * rs + rp * rp);
    }
    return kr;
}
总结

折光率是光线从一种介质射向另一种介质时被折射的程度,其计算包含许多物理上的因素。在计算机图形学中,折光率的应用很广泛,如最近点采样算法和材质表面效果的计算中。