光线跟踪是一种真实地显示物体的方法,该方法由Appel在1968年提出。光线跟踪方法沿着到达视点的光线的反方向跟踪,经过屏幕上每一个象素,找出与视线相交的物体表面点P0,并继续跟踪,找出影响P0点光强的所有光源,从而算出P0点上精确的光线强度,在材质编辑中经常用来表现镜面效果。光线跟踪或称光迹追踪是
计算机图形学的核心算法之一。在算法中,光线从
光源被抛射出来,当他们经过物体表面的时候,对他们应用种种符合物理光学定律的变换。最终,光线进入虚拟的摄像机底片中,图片被生成出来。
简介
光线跟踪(Ray tracing),又称为光迹追踪或光线追迹,来自于
几何光学的一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。它用于光学系统设计,如照相机镜头、显微镜、望远镜以及双目镜等。这个术语也用于表示三维计算机图形学中的特殊
渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型显现出来。这样得到的结果类似于光线投射与
扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与
折射有更准确的模拟效果,并且效率非常高,所以当追求这样高质量结果时候经常使用这种方法。
在物理学中,光线追迹可以用来计算
光束在介质中传播的情况。在介质中传播时,光束可能会被介质吸收,改变传播方向或者射出介质表面等。我们通过计算理想化的窄光束(光线)通过介质中的情形来解决这种复杂的情况。
在实际应用中,可以将各种电磁波或者微小粒子看成理想化的窄波束(即光线),基于这种假设,人们利用光线追迹来计算光线在介质中传播的情况。光线追迹方法首先计算一条光线在被介质吸收,或者改变方向前,光线在介质中传播的距离,方向以及到达的新位置,然后从这个新的位置产生出一条新的光线,使用同样的处理方法,最终计算出一个完整的光线在介质中传播的路径。
由于该算法是成像系统的完全模拟,所以可以模拟生成十分复杂的图片。
业界公认此算法为Turner Whitted在1980年提出。世界主要国家的图形学学生都要实习此算法。他的一个著名的实现是
开源软件。
自然现象
在自然界中,光源发出的光线向前传播,最后到达一个妨碍它继续传播的物体表面,我们可以将“光线”看作在同样的路径传输的光子流,在完全真空中,这条光线将是一条直线。但是在现实中,在光路上会受到三个因素的影响:吸收、反射与
折射。物体表面可能在一个或者多个方向反射全部或者部分光线,它也可能吸收部分光线,使得反射或者折射的光线强度减弱。如果物体表面是透明的或者半透明的,那么它就会将一部分光线按照不同的方向折射到物体内部,同时吸收部分或者全部光谱或者改变光线的颜色。吸收、反射以及折射的光线都来自于
入射光线,而不会超出入射光线的强度。例如,一个物体表面不可能反射66% 的输入光线,然后再
折射50% 的输入光线,因为这二者相加将会达到 116%。这样,反射或者折射的光线可以到达其它的物体表面,同样,吸收、反射、折射的光线重新根据入射光线进行计算。其中一部分光线通过这样的途径传播到我们的眼睛,我们就能够看到最终的
渲染图像及场景。
一般描述
为了生成在
三维计算机图形环境中的可见图像,光线跟踪是一个比光线投射或者
扫描线渲染更加逼真的实现方法。这种方法通过逆向跟踪与假象的照相机镜头相交的
光路进行工作,由于大量的类似光线横穿场景,所以从照相机角度看到的场景可见信息以及软件特定的光照条件,就可以构建起来。当光线与场景中的物体或者媒介相交的时候计算光线的反射、
折射以及吸收。 光线跟踪的场景经常是由程序员用数学工具进行描述,也可以由视觉艺术家使用中间工具描述,也可以使用从数码相机等不同技术方法捕捉到的图像或者模型数据。
由于一个光源发射出的光线的绝大部分不会在观察者看到的光线中占很大比例,这些光线大部分经过多次反射逐渐消失或者至无限小,所以对于构建可见信息来说,逆向跟踪光线要比真实地模拟光线相互作用的效率要高很多倍。计算机模拟程序从光源发出的光线开始查询与观察点相交的光线从执行与获得正确的图像来说是不现实的。
这种方法的一个明显缺点就是需要假设光线在观察点处终止,然后进行逆向跟踪。在一定数量的最大反射之后,最后交点处的光线强度使用多种算法进行估计,这些算法可能包括经典的
渲染算法,也可能包括如辐射着色这样的技术。
递归算法
对图像中的每一个像素 {
创建从视点通过该像素的光线
初始化 最近T 为 无限大,最近物体为空值
对场景中的每一个物体 {
如果光线与物体相交 {
如果交点处的 t 比最近T小 {
设置最近T 为焦点的 t 值
设置 最近物体 为该物体
}
}
}
如果最近物体为空值{
用背景色填充该像素
} 否则 {
对每个光源射出一条光线来检测是否处在阴影中
使用最近物体 和最近T来计算着色函数
以着色函数的结果填充该像素
}
}
特点
优点
光线跟踪的流行来源于它比其它
渲染方法如
扫描线渲染或者光线投射更加能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是
光线跟踪算法的一种自然结果。光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。
缺点
光线跟踪的一个最大的缺点就是性能,扫描线算法以及其它算法利用了数据的一致性从而在像素之间共享计算,但是光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。尽管它正确地处理了相互反射的现象以及
折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常紧似或者完全实现
渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个
光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。
实时跟踪
人们已经进行了许多努力,改进如计算机与视频游戏这些交互式三维图形应用程序中的实时光线跟踪速度。
OpenRT 项目包含一个高度优化的光线跟踪软件内核,并且提供了一套类似于 OpenGL 的 API 用于替代交互式三维图形处理中基于rasterization 的实现方法。
一些光线跟踪硬件,如斯坦福大学开发的实验性的光线处理单元,都是设计成加速光线跟踪处理中那些需要大量计算的操作。
自从二十世纪九十年代末开始,一些 demo programmers 爱好者就已经开发了一些光线跟踪的实时三维引擎软件。但是,demos 中的光线跟踪为了实现足够高的帧速经常使用一些不正确的近似甚至是欺骗的手段。
光学设计
计算机图形学中的光线跟踪的名称与原理源自于二十世纪最初十年就已经开始出现的
光学镜头设计中的古老技术。几何光线跟踪用于描述光线通过镜头系统或者光学仪器时的传输特性,并建立系统的
成像属性模型。这用于建造前优化光学仪器的设计,例如减少
色像差或者其它的光学像差。光线跟踪也用于计算光学系统中的
光程差,光程差用于计算光学波前,而光学波前用于计算系统的衍射作用,例如
点扩展函数、
调制传递函数以及 Strehl ratio。光线跟踪不仅用于摄影领域的镜头设计,也可以用于微波设计甚至是无线电系统这样的较长波长应用,也可以用于紫外线或者
X射线光学这样的较短波长领域。
计算机图形学与光学设计领域所用的光线跟踪的基本原理都是类似的,但是光学设计所用的技术通常更加严格,并且能够更加正确地反映光线行为。尤其是
光的色散、
衍射效应以及
光学镀膜的特性在
光学镜头设计中都是非常重要的,但是在计算机图形学领域就没有那么重要了。
在计算机出现以前,光线跟踪需要使用三角以及
对数表手工计算,许多传统摄影镜头的光学公式都是许多人共同完成优化的,每个人只能处理其中一小部分的计算工作。这些计算可以在如来自于 Lambda Research 的 OSLO 或者 TracePro、Code-V 或者 Zemax 这些光学设计软件上完成。一个简单的光线跟踪版本是光线传递矩阵分析,它通常用于激光
光学谐振腔的设计。