光线追踪算法

发布于: 修改于:雪球转发:1回复:0喜欢:1

在自然界中,光源发出的光线向前传播,最后到达一个妨碍它继续传播的物体表面,我们可以将“光线”看作在同样的路径传输的光子流,在完全真空中,这条光线将是一条直线。但是在现实中,在光路上会受到三个因素的影响:吸收、反射与折射。

物体表面可能在一个或者多个方向反射全部或者部分光线,它也可能吸收部分光线,使得反射或者折射的光线强度减弱。如果物体表面是透明的或者半透明的,那么它就会将一部分光线按照不同的方向折射到物体内部,同时吸收部分或者全部光谱或者改变光线的颜色。

吸收、反射以及折射的光线都来自于入射光线,而不会超出入射光线的强度。例如,一个物体表面不可能反射66%的输入光线,然后再折射50%的输入光线,因为这二者相加将会达到 116%,这样,反射或者折射的光线可以到达其它的物体表面。同样,吸收、反射、折射的光线重新根据入射光线进行计算,其中一部分光线通过这样的途径传播到我们的眼睛,我们就能够看到最终的渲染图像及场景。

由于一个光源发射出的光线的绝大部分不会在观察者看到的光线中占很大比例,这些光线大部分经过多次反射逐渐消失或者至无限小,所以对于构建可见信息来说,通过计算机模拟程序完全追踪出光源发出的光线与场景物体的作用,从计算量上来说是不现实的。

光线投射(Ray Casting)

光线投射作为光线追踪算法中的第一步,其理念起源于1968年,由Arthur Appel在一篇名为《 Some techniques for shading machine rendering of solids》的文章中提出。其具体思路是从每一个像素射出一条射线,然后找到最接近的物体挡住射线的路径,而视平面上每个像素的颜色取决于从可见光表面产生的亮度。

                                      光线投射:每像素从眼睛投射射线到场景

光线追踪(Ray Tracing)

1979年,Turner Whitted在光线投射的基础上,加入光与物体表面的交互,让光线在物体表面沿着反射,折射以及散射方式上继续传播,直到与光源相交。这一方法后来也被称为经典光线跟踪方法、递归式光线追踪(Recursive Ray Tracing)方法,或 Whitted-style 光线跟踪方法。

光线追踪方法的主要思想是从视点向成像平面上的像素发射光线,找到与该光线相交的最近物体的交点,如果该点处的表面是散射面,则计算光源直接照射该点产生的颜色;如果该点处表面是镜面或折射面,则继续向反射或折射方向跟踪另一条光线,如此递归下去,直到光线逃逸出场景或达到设定的最大递归深度。

经典的光线追踪:每像素从眼睛投射射线到场景,并追踪次级光线((shadow, reflection, refraction),并结合递归。

光线跟踪的一个最大的缺点就是性能,需要的计算量非常巨大。传统的光栅图形学中的算法,利用了数据的一致性从而在像素之间共享计算,而光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。

                                                      基于光线追踪渲染出的效果图

                                                       典型的光线追踪渲染效果图

尽管它正确地处理了相互反射的现象以及折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常近似或者完全实现渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。

于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。

分布式光线追踪(Distributed Ray Tracing)

Cook于1984年引入蒙特卡洛方法(Monte Carlo method)到光线跟踪领域,将经典的光线跟踪方法扩展为分布式光线跟踪算法,又称为随机光线追踪(stochasticray tracing),可以模拟更多的效果,如金属光泽、软阴影、景深( Depthof Field)、运动模糊等等。

路径追踪(Path Tracing)

Kajiya于1986年提出了路径追踪算法的理念,开创了基于蒙特卡洛的全局光照这一领域。根据渲染方程, Kajiya 提出的路径追踪方法是第一个无偏(Unbiased)的渲染方法。路径追踪的基本思想是从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向,发出另一条光线,如此迭代,直到光线打到光源上(或逃逸出场景),然后用蒙特卡洛的方法,计算其贡献,作为像素的颜色值。

简单来说,路径追踪 = 光线追踪+ 蒙特卡洛方法。

                                                        基于路径追踪渲染的效果图

双向路径追踪(Bidirectional Path)

双向路径追踪的基本思想是同时从视点、光源打出射线,经过若干次反弹后,将视点子路径( eye path) 和光源子路径( light path) 上的顶点连接起来(连接时需要测试可见性),以快速产生很多路径。这种方法能够产生一些传统路径追踪难以采样到的光路,所以能够很有效地降低噪声。 进一步的, [Veach 1997]将渲染方程改写成对路径积分的形式,允许多种路径采样的方法来求解该积分。

网页链接 光线追踪技术的理论和实践(面向对象)

网页链接 用JavaScript玩转计算机图形学(一)光线追踪入门

$Adobe(ADBE)$                        $欧特克(ADSK)$                       $微软(MSFT)$