光线跟踪(Ray Tracing)
目录
|
光线跟踪是指一种在二维(2D)屏幕上呈现三维(3D)图像的技术。
光线跟踪程序可以识别和复制光线的路线,但是方向相反(从眼睛到原点)。每个光线路径由多个直线部件组成,并且包括点的反射、折射和阴影效应。在动画中,每一束光线的直线部件的位置和方向总是在不断变化,因此每一条光线都要用一个数学方程式来表示,把通过空间的光线路径定义为时间函数。基于光线通过的场中的色素,光线被分配颜色。显示屏上的每个像素都与一个光线对应。
光线跟踪最先是在20世纪60年代由一个数学应用组的科学家发明的。光线跟踪广泛应用于电脑游戏、卡通动画、电视、DVD节目和电影制作。
为了生成在三维计算机图形环境中的可见图像,光线跟踪是一个比光线投射或者扫描线渲染更加逼真的实现方法。这种方法通过逆向跟踪与假象的照相机镜头相交的光路进行工作,由于大量的类似光线横穿场景,所以从照相机角度看到的场景可见信息以及软件特定的光照条件,就可以构建起来。当光线与场景中的物体或者媒介相交的时候计算光线的反射、折射以及吸收。
光线跟踪的场景经常是由程序员用数学工具进行描述,也可以由视觉艺术家使用中间工具描述,也可以使用从数码相机等不同技术方法捕捉到的图像或者模型数据。
由于一个光源发射出的光线的绝大部分不会在观察者看到的光线中占很大比例,这些光线大部分经过多次反射逐渐消失或者至无限小,所以对于构建可见信息来说,逆向跟踪光线要比真实地模拟光线相互作用的效率要高很多倍。计算机模拟程序从光源发出的光线开始查询与观察点相交的光线从执行与获得正确的图像来说是不现实的。
这种方法的一个明显缺点就是需要假设光线在观察点处终止,然后进行逆向跟踪。在一定数量的最大反射之后,最后交点处的光线强度使用多种算法进行估计,这些算法可能包括经典的渲染算法,也可能包括如辐射着色这样的技术。
Arthur Appel 于 1968 年首次提出用于渲染的光线投射算法。光线投射的基础就是从眼睛投射光线到物体上的每个点,查找阻挡光线的最近物体,也就是将图像当作一个屏风,每个点就是屏风上的一个正方形。通常这就是眼睛看到的那个点的物体。根据材料的特性以及场景中的光线效果,这个算法可以确定物体的浓淡效果。其中一个简单假设就是如果表面面向光线,那么这个表面就会被照亮而不会处于阴影中。表面的浓淡效果根据传统的三维计算机图形学的浓淡模型进行计算。光线投射超出扫描线渲染的一个重要优点是它能够很容易地处理非平面的表面以及实体,如圆锥和球体等。如果一个数学表面与光线相交,那么就可以用光线投射进行渲染。复杂的物体可以用实体造型技术构建,并且可以很容易地进行渲染。
位于纽约 Elmsford, New York Mathematical Applications Group, Inc.(MAGI)的科学家首次将光线投射技术用于生成计算机图形。1966 年,为了替美国国防部计算放射性污染创立了这个公司。MAGI 不仅计算了伽马射线如何从表面进行反射(辐射的光线投射自从二十世纪四十年代就已经开始计算了),也计算了它们如何穿透以及折射。这些研究工作帮助政府确定一些特定的军事应用;建造能够保护军队避免辐射的军用车辆,设计可以重入的太空探索交通工具。在 Philip Mittelman 博士的指导下,科学家们开发了一种使用同样基本软件生成图像的方法。1972 年,MAGI 转变成了一个商业动画工作室,这个工作室使用光线投射技术为商业电视、教育电影以及最后为故事片制作三维计算机动画,他们全部使用光线投射制作了 Tron 电影中的绝大部分动画。MAGI 于 1985 年破产。
下一个重要的研究突破是 Turner Whitted 于 1979 年做出的。以前的算法从眼睛到场景投射光线,但是并不跟踪这些光线。当光线碰到一个物体表面的时候,可能产生三种新的类型的光线:反射、折射与阴影。光滑的物体表面将光线按照镜像反射的方向反射出去,然后这个光线与场景中的物体相交,最近的相交物体就是反射中看到的物体。在透明物质中传输的光线以类似的方式传播,但是在进入或者离开一种物质的时候会发生折射。为了避免跟踪场景中的所有光线,人们使用阴影光线来测试光线是否可以照射到物体表面。光线照射到物体表面上的某些点上,如果这些点面向光线,那么就跟踪这段交点与光源之间的光线。如果在表面与光源之间是不透明的物体,那么这个表面就位于阴影之中,光线无法照射。这种新层次的光线计算使得光线跟踪图像更加真实。
光线跟踪的流行来源于它比其它渲染方法如扫描线渲染或者光线投射更加能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是光线跟踪算法的一种自然结果。光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。
光线跟踪的一个最大的缺点就是性能,扫描线算法以及其它算法利用了数据的一致性从而在像素之间共享计算,但是光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。尽管它正确地处理了相互反射的现象以及折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常近似或者完全实现渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。