光线追踪中的反射和折射

2020-09-21  本文已影响0人  Dragon_boy

光线追踪的一个优势在于,通过扩展光线传播的理念,我们可以很简单地实现反射和折射,两者在模拟玻璃或镜面材质时会很方便。1979年的一篇论文An Improved Illumination Model for Shaded Display中,Turner Whitted首先描述了如何扩展Appel的光线追踪算法来进行更高级的渲染。Whitted的理念包含反射和折射的计算。

光学中,反射和折射是很常见的现象。首先介绍一下,我们以一个玻璃球作为例子,同时拥有折射和反射属性。只要我们知道与球交叉的光线的方向,就很容易计算折射和反射。反射和折射方向基于交叉点的法线方向和入射光的方向。为了计算折射方向,我们还需要材质的折射系数。尽管我们之前提过光线以直线前进,我们可以假设折射是光线弯曲了。当光子碰撞到一个不同的介质表面时,它的方向会改变。

类似地,我们必须意识到物体的反射和折射是同时进行的。我们需要对一个表面上的给定点同时计算,但我们如果进行混合?混合不能直接的五五分,混合值区域局主光线和物体法线的角度和折射系数。我们可以通过菲涅尔等式来计算这一点。

回到正题上,我们介绍一下Whitted算法的工作原理。我们从眼睛射出一条主光线到与场景中物体的最近交叉点。如果光线碰撞到一个非漫反射或不透明的物体,我们必须进行额外的工作。为了在该点计算结果颜色,假设一个玻璃球,我们需要计算反射颜色和折射颜色,然后混合。记住,我们会用三步进行,计算反射颜色,计算折射颜色,然后应用到菲涅尔等式中。

下面是伪代码:

// compute reflection color
color reflectionCol = computeReflectionColor();
// compute refraction color
color refractionCol = computeRefractionColor();
float Kr; // reflection mix value
float Kt; // refraction mix value
fresnel(refractionIndex, normalHit, primaryRayDirection, &Kr, &Kt);
// mix 
color glassBallColorAtHit = Kr * refelctionCol + (1-Kr)*refractionCol;
上一篇 下一篇

猜你喜欢

热点阅读