📅  最后修改于: 2023-12-03 14:54:36.918000             🧑  作者: Mango
折光率是光线在从一种介质射向另一种介质时被折射的程度。在同一份介质中,光线传播是沿直线传播,而不会发生偏折。但是当光线穿过介质表面时,会因为速度的变化而发生折射。折光率取决于光线穿过的两种介质,在物理层面上是介质分子的特性。折射定律表明,入射角与折射角的正弦之比等于两种介质的折射率之比。
折光率通常用符号 $n$ 表示,可以由下面公式计算得出:
$$n = \frac{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;
}
折光率是光线从一种介质射向另一种介质时被折射的程度,其计算包含许多物理上的因素。在计算机图形学中,折光率的应用很广泛,如最近点采样算法和材质表面效果的计算中。