正向追踪
如果我们试着在计算机生成图像这一过程中模拟光线与物体的交互,那么我们除了明白光线会在物体表面反射外,还需要注意一点。物体反射的光线的数量很多,只有其中的一部分会进入我们的眼中。例如,想象一下我们创建了一个光源,每次只会发射一个光子,该光子从光源出发,沿着光路前进,直到碰撞到物体表面,忽略光子吸收的话,我们可以假设该光子沿一个任意的方向反射,如果光子碰撞到我们眼睛的表面上,我们就会看见表面上光子反射的点,见下图:

有一个问题,之前我们提到过,物体的表面上的每一个点会向四面八方反射光线,这是否与我们所说的随机相违背?其实都对。解释光线为什么向四面八方反射是一个物理课题。在自然中,一个光子在表面上反射时会以一个特定的方向反射,这区语句几何体的拓扑结构,以及光子的入射方向。漫发射物体的表面会看起来比较光滑,不过如果在微观层面观察,会发现非常的复杂,完全不光滑。光子非常小,它们会被物体表面的微观结构反射,如果光线碰撞到漫反射的物体表面,其中的光子会各自碰撞到不同的微观结构的表面,这样就会向很多方向反射,因此,我们可以说是向任何可能的方向反射。有时某些材质的微观结构非常的整齐划一,这样就会让物体在某一特定方向反射光线,这被描述为各向异性反射。>
我们现在先看一看图形学的一些术语。首先,我们用由像素复合的图片表面替换眼睛,在这一情况下,发射的光子会碰撞到图片表面的许多像素中的一个,然后就会增加其中某一点的亮度值。重复这一过程直到所有的像素被调整,创建一个计算机生成的图片。这一技术被称为正向光线追踪,因为我们是沿着光子从光源到观察者的方向来进行的。
该方法有一些问题:在我们的例子中,我们假设反射的光子总是会遇到我们眼睛的表面。实际上,光线会向任何可能的方向反射,其中会由很少很少的光线会碰撞到我们的眼睛。我们会从光源发射庞大数量的光子,然后找到可能会碰到眼睛的光子。事实上就是这么实现的,数不胜数的光子沿光线方向以光速飞行,在计算机世界中,在场景中模拟这么大数量的光子并不是一个可行的方法。
因此,我们可以想一下,其实不太需要向随机的方向发射光子。由于我们知道眼睛的位置,为什么不只是向一个方向发射光子,然后看一下哪个像素接收到了光子。这是一种可能的优化方法,然而我们只会对某些特定的材质类型使用该方法。对于我们接下来要讲解的光物质交互,对于漫发射表面方向性并不那么重要。这是因为碰撞到漫发射表面的光子可以在一个半球范围内沿任意方向反射。然而,如果表面是镜子,而且没有漫发射部分,那么光线就只能沿某一精确方向仿射。对于这种类型的表面,我们不能人为改变光子的方向,意味着我们所提到方法不太合适。
即使我们决定使用该方法,同时场景只有漫反射物体组成,我们仍会遇到一个问题。我们想象一下自己正向一个物体表面喷射光线,如果喷射的密度不够,有些区域就不会被完全照明。
想象一下我们试着使用一个白色记号笔在一张黑纸上用点画一个茶壶(将每个点想象为一个光子)。一开始只有很少的光子与茶壶模型交叉,有许多未覆盖的区域,当我们持续添加光子时,光子的密度会增加,茶壶也渐渐的被点填充,模型的外形也渐渐完整。
但如果发射1000个光子或甚至发射多次,这并不能保证物体的表面会被光子完全覆盖。这是该技术的一个缺点,换句话说,我们需要让程序不断运行,直到喷射了足够的光子让物体的表面得到了比较正确的外形。这意味着我们需要在渲染时观察图像来决定何时停止程序。在生产过程中,这一情况完全不可能。另外,之后我们会看到,光线追踪器最耗费性能的任务是找到光线与几何体的交叉区域。从光源创建大量的光子并不是一个问题,但找出它们与场景中物体的交叉情况就是一个极其耗费性能的工作了。
反向追踪
该方法从观察者到光源来追踪光线。因为该追踪方法的起源是观察者,因此也被称为反向光线追踪或眼追踪,见下图:

这一方法针对正向追踪的缺陷提供了不错的方案。由于我们的模拟不能像自然一般快速,我们需要进行折中拖鞋,从眼睛进行光线追踪。如果光线碰撞到一个物体,我们就会找到接受到的光线的程度,通过将另一个光线从碰撞到发射到场景中的光源中。偶尔光线会被场景中的其它物体遮挡,意味着我们的初始碰撞点位于阴影中,也就是不会受到光照影响。因此,我们将这些光线称为阴影光线。在CG术语中,从眼睛射向场景中的第一束光线称为主光线、可见光线或摄像机光线。
网友评论