蒙特卡罗光线追踪

更新时间:2023-12-19 08:49:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

光线追踪原理

光的基本传递模型

1 在一个要渲染的场景中,我们认为光能由预先指定的光源发出,然后我们以光线来描述光能的传递过程,当整个场景中的光能信息被我们计算出来后,我们收集这些信息转化为顶点的亮度。

2 光线经过物体表面可以产生反射和漫反射,光线透过物体可以产生折射和散射。具体产生哪种出射效果,依据物体的表面属性而定。物体的表面一般不会是理想的某种单一属性的表面,表面可以同时存在反射,折射,漫反射等多种属性,各种属性按一定比例混合之后才是其表面反射模型。

3 一点的在某一个视线方向上的光亮度=该点在该方向的自身发光亮度+半球入射光能在该方向所产生的反射光亮度. 4 关于散射,高度真实的散射是一个很难模拟的物理过程,一般在渲染中都不会采用过于复杂的物理模型来表示散射,而是采用一些取巧的办法来计算散射。 5 在常见的渲染中,有两种效果很难模拟,但是它们会使人眼觉得场景更真实。 [1]color bleeding :入射光为漫反射,受光表面属性为漫反射,出射光是漫反射。比如把一本蓝色的纸制的书靠近白色的墙,墙上会有浅浅的蓝晕。 [2]caustics:入射光为镜面反射或折射,受光表面属性为漫反射,出射光是漫反射。比如把一个装了红色葡萄酒的酒杯放在木桌上面,会有光透过杯中的酒在桌上形成一块很亮的红色区域。

传统的阴影算法:

游戏中传统的光照算法,是利用公式法来计算特定类型光源的直接光照在物体表面所产生的反射和漫反射颜色,然后再使用阴影算法做阴影补偿。标准的阴影算法不能计算面光源,改进以后的阴影算法通过对面光源采样,可以模拟出软阴影的效果。但是这些方法计算的光照都是来自直接光源的,忽略了光的传播过程,也就无法计算出由光的传播所产生的效果。通过特定的修正,我们也可以计算特定的反射折射或漫反射过程,但是无法给出一种通用并且物理正确的方法。目前游戏中大多是采用改进的阴影算法来进行渲染,它的优点是效率比较高,结合预计算的话,还是可以产生比较生动可信的效果。

传统的逆向光线追踪:

正如前面描述的那样,要想计算光能在场景中产生的颜色,最自然的考虑就是,从光源出发,正向跟踪每一根光线在场景中的传递过程,然后收集信息。然而这个想法在被提出的来的那个时代的计算机硬件上是不可能实现的,当时人们认为,正向光线追踪计算了大量对当前屏幕颜色不产生贡献的信息,而且它把看不见的物体也计算在内,极大的浪费了效率。

于是人们想出的另一个方法是:只计算有用的,从人眼出发,逆向跟踪光线。 逆向光线追踪从视点出发,向投影屏幕发出光线,然后追踪这个光线的传递过程。如果这个光线经过若干次反射折射后打到了光源上,则认为该光线是有用的,递归的计算颜色,否则就抛弃它。很显然,这个过程是真实光线投射的逆过程,它同样会产生浪费(那些被抛弃的逆向光线),而且只适用于静态渲染。 逆向光线追踪算法中的顶点亮度主要包括三个方面: 1由光源直接照射而引起的光亮度

2来自环境中其它景物的反射折射光在表面产生的镜面反射光亮度 3来自环境中其它景物的反射折射光在表面产生的规则透射光亮度 4预设定的顶点漫反射颜色 显然,这一过程仅跟踪景物间的镜面反射光线和规则透射光线,忽略了至少经过一次漫反射之后光能传递,而且该算法中的物体表面属性只能是单一的,因而它仅模拟了理想表面的光能传递。 对于该算法的具体描述:

1从视点出发,经过投影屏幕上的每一个像素向场景发射一根虚拟的光线。 2求光线与场景最近的交点。 3递归跟踪:

(1)如果当前交点所在的景物表面为理想镜面,光线沿其镜面反射方向继续跟踪。 (2)如果当前交点所在的景物表面为规则投射表面,光线沿其规则投射方向继续跟踪。

4递归异常结束:

(1)光线与场景中的景物没有交点

(2)当前交点所在的景物表面为漫反射表面 (3)跟踪层次已经超过用户设定的最大跟踪层数

(4)所跟踪的光线对显示像素的光亮度的贡献小于一预先设定的阀值 5递归正常结束:

(1)光线于光源相交,取得光亮度值,按递归层次反馈。

传统的光线追踪技术可以较好的表现出反射折射效果,也可以生成真实度比较高的阴影。但是他的光照都比较硬,无法模拟出非常细腻的柔化效果。 光线追踪需要对大量的光线进行多次与场景中物体的求交计算。如何避免这些求交计算成为光线追踪追求效率的本质。早期的光线追踪算法都是通过各种空间划分技术来避免无谓的求交检测,这些方法对于之后的理论同样有效,常见的空间划分方法分为两类,一类是基于网格的平均空间划分,一类是基于轴平行的二分空间划分。

蒙特卡罗光线追踪:

1对传统的逆向光线追踪的改进

传统的逆向光线追踪算法有两个突出的缺点,就是表面属性的单一,和不考虑漫反射。我们不难通过模型的修正来缓解这两个问题。我们首先认为一个表面的属性可以是混合的,比如它有20%的成分是反射,30%的成分是折射,50%的成分是漫反射。这里的百分比可以这样理解,当一根光线打在该表面后,它有20%的概率发生反射,30%的概率发生折射,50%的概率发生漫反射。然后我们通过多次计算光线跟踪,每次按照概率决定光线的反射属性,这样在就把漫反射也考虑了进去。具体的算法如下:

(1)从视点出发,经过投影屏幕上的每一个像素向场景发射一根虚拟的光线。 (2)当光线与景物相交时按照俄罗斯轮盘赌规则决定他的反射属性。

(3)根据不同的反射属性继续跟踪计算,直到正常结束或者异常结束。如果反射的属性为漫反射,则随机选择一个反射方向进行跟踪。

(4)重复前面的过程,把每次渲染出来的贴图逐像素叠加混合,直到渲染出的结果达到满意程度。

该方法是一种比较简易的基于物理模型的渲染,其本质就是通过大量的随机采样

来模拟半球积分。这种方法在光照细节上可以产生真实度很高的图像,但是图像质量有比较严重的走样,而且效率极其低下。

2蒙特卡罗光线追踪-采样

蒙特卡罗光线追踪的本质就是通过概率理论,把半球积分方程进行近似简化,使之可以通过少量相对重要的采样来模拟积分。蒙特卡罗光线追踪理论中的采样方案有很多,有时候还要混合使用这些采样方案。 蒙特卡罗光线追踪已经是一个比较完备的渲染方案,他极大的解决了光线追踪的模型缺陷和效率问题,使得在家用图形硬件上做基于物理的渲染成为一种可能。但是我们仍然无法实时的进行计算,而且如何解决图像走样的问题也是蒙特卡罗光线追踪的一大难点。 相对于普通光线追踪,蒙特卡罗光线追踪引入了更复杂的漫反射模型,从而增加了需要跟踪的光线数量。但是他又通过采样算法减少了需要跟踪光线,所以其核心效率取决于采样模型。 与普通光线追踪一样,为了减少不必要的求交检测,蒙特卡罗光线追踪也需要使用空间划分技术,最常用的是平衡kdtree。蒙特卡罗光线追踪虽然是一种逆向光线追踪算法,但是其采样的理论却与光线追踪的方向无关,可以用于任何一种渲染方案。

此外,使用蒙特卡罗光线追踪不容易计算caustics现象。也就是说它不容易计算由镜面反射或者规则透射引起的漫反射。(但是很容易计算由漫反射引起的镜面反射或者规则透射;)

蒙特卡罗光线追踪本身也是一种逆向光线跟踪。逆向光线追踪最初被设计出来是为了只计算那些会影响最终屏幕像素的光能传递过程,这一思想在早期硬件并不发达,对最终影响要求也不高的年代是非常实用的。但是我认为由于对屏幕上每个像素的跟踪都是无关的,即每两次跟踪之间都不会建立通信说哪些是计算过的,哪些是没计算过的,所以这里面必然会包含大量的重复计算的中间过程。当我们对图像所表现效果的真实度非常高的时候,必然会产生巨量的采样,然后重复计算的问题就会被放大,而由逆向追踪思想带来的那些优势也将荡然无存。而且,对场景中光能贡献越大的光源应该被越多的采样跟踪覆盖到,但是逆向光线跟踪只是对屏幕上每个像素反复遍历追踪,其结果应该趋向于采样平均覆盖各个光源,如果要想对高亮度光源采很多的样本,必然也会导致对其它光源也过多的采了样本,这会非常浪费效率。重新考虑正向光线追踪,光由光源发出,打在场景之中,每一次光能转化都被记录下来,最后只要收集这些信息就可以知道任意点上面的亮度,这个方法的描述非常的贴近真实的自然,关键在于如何保证速度。

另外,完全的逆向光线追踪根本就不应该作为实时渲染的算法,道理很简单,光能的传递过程不变,只要视点一变,就要重新计算。

[辐射度算法]

辐射度的算法分为三个步骤

1先把场景中的面划分为一个个小的patch,然后计算两个patch之间的形式因子。两个patch之间的形式因子表示了一个patch出射的光有多少比例会被另一个patch接收。对于任意一个有n个patch的场景来说,总有n*(n-1)个形式因子。

2通过迭代法来找到一个光能传递的平衡状态 3把第二步所产生的亮度值作为顶点色渲染

辐射度算法会非常的慢,而且如果不考虑额外的复杂度,辐射度算法很难计算镜面反射,改进的辐射度算法可以缓解这一问题。很多研究者都试图结合光线追踪和辐射度这两种方法,以期达到各自的优势。

[photonmaping+final Gathering]:

前面谈到,正向光线追踪才是最自然的光能传递的描述,由此,在1994年,有人提出了photonmaping算法。photonmaping是一个两步的算法,第一步通过正向光线跟踪来构建光子图,第二步通过光子图中的信息来渲染整个场景。它的核心思想是从光源开始追踪光能的传递,把每一个传递中间过程都记录下来,最后按照投影或者逆向光线追踪来收集这些信息,以达到渲染的目的。由于中间每一个光线和场景的相交都被记录下来,所以他很自然的避免了逆向光线追踪中重复计算的问题。

具体的,这两步算法又可以分为下面四步。

1从光源发射出N根采样光线。光线的方向和光源的类型有关。采样光线的数目选择与光源自身的亮度有关,越亮的光源应该选择越多的采样。

2光子打到场景中,一步步传递,把光能传递的过程记录下来,结果放在kdtree中

3用逆向光线追踪或者反投影的方法找到可视点

4使用逆向光线追踪和半球积分(比如最终聚集)方法收集光子图中的信息,从而计算可视点的光亮度。

首先要选择一个光源,然后才能发射一个光子。对于场景中的多个光源,每次做发射一个光子采样的时候,不能完全的随机选择光源,一个光源被选中的概率要正相关于他的在该场景中的能量 典型的,光源一般被分为: (1)点光源:

点光源的数据结构仅仅是三维空间中的一个坐标。对点光源所发出的光线进行采样时,可以在包围该点的单位球上任选一点,然后以球心到该点的射线作为采样光线。也有人建议用单位立方体包围盒采样来代替单位球。 (2)方形面光源:

方形面光源上的每一个点都可以看做一个只能从靠近面法向量一侧发射光线的点光源。

(3)其它光源:

任意空间形状和物理特性的光源,只能具体问题具体分析。

一旦选好了初始要追踪的光子向量的位臵和方向,我们就可以开始一次正向追踪。 一般的,光子在与场景中景物的相交的情况可以分为三类

(1)如果光子打到了镜面反射表面或者规则折射表面,不用做任何记录,继续追踪。

(2)如果光子打到了漫反射表面,则把光子所携带的能量和入射方向记录下来。 如果入射光是折射或者反射光,则把光子记入caustics map,否则就记入全局map; 其实,对于每一次相交,我们即可以记录入射光子,也可以记录出射光子。但是我们选择了记录入射光子。

我们记录镜面反射与规则折射的光子信息是没有意义的,因为我们不可能把所有的镜面反射和规则折射过程都记录下来,所以这一类亮度还是要通过逆向光线追踪或其它方法来计算。但是我们记录漫反射过程中的采样信息是有用的。因为我

们可以通过某一点的部分入射采样光子来近似的模拟该点的全部入射光子。然后我们可以计算该点任意方向上的出射光子。这也决定了我们只能记录入射光子信息而不是出射光子信息。记录入射光子还可以让我们通过选择不同的brdf甚至不同的简化模型来重构每一次反射过程,这样我们就可以随心所欲的计算。 那么我们后面如何通过一点的入射光子来计算该点的出射光子呢,我们选择一个包围该点的范围很小的球空间,把这个空间里所有的入射光子按照半球积分模型计算,就可以算出该点的出射光子。

(3)如果光子打到的表面既有一定的镜面反射属性,又有一定的漫反射属性,则依据两种属性各自所占的百分比,使用俄罗斯轮盘赌原则来决定该次的反射属性。 (4)光子再决定了反射属性之后,还要依据反射属性再随机一次,以判定其是被表面吸收还是发射出去。

构造好光子贴图之后,我们就可以在第二步收集这些信息来计算顶点亮度。 我们首先来看一个对光能半球积分简化过了的公式: L*f = ( L(l)+L(c)+L(d) )*( f(s)+f(d) )

这个公式中,L表示入射光的集合,f表示该点的表面反射属性集合。

L(l)表示直接光照,L(c)表示纯粹的反射折射光,L(d)表示至少经历了一次漫反射的入射光

f(s)表示镜面反射或者规则透射brdf,f(d)表示漫反射brdf。

L*f的结果就是出射光的亮度,我们要做的就是如何快速的计算L*f。 我们把上面的等式分化一下: L*f = L(l)*( f(s)+f(d) ) + f(s)*L(c) + f(s)*L(d) + f(d)*L(c) + f(d)*L(d)

如果直接采用半球积分方程进行计算,需要大量的采样,我们这种分化把半球积分分化为四部分,对不同的部分采用不同的办法计算,这样每一种都不会产生大量的采样,合起来的计算复杂度远远低于原来不分开计算的。

(1)直接光源照射,反射属性为所有。

(2)入射光源为镜面反射或者规则透射或者漫反射,反射属性为镜面反射或者规则透射。

(3)入射光源为纯反射或透射,反射属性为漫反射。

(4)入射光源为至少经过一次漫反射的,反射属性为漫反射。

对于(1),我们采用shadow ray的方法计算直接光照。 对于(2),我们采用经典Monte Carlo光线追踪来计算。 对于(3),我们收集来自caustics map中的光子信息。 对于(4),我们收集来自全局map中的光子信息。

这样,一次典型的正向光线追踪的计算就完成了。即使是photon map算法,对于普通硬件,暂时也只能用于静态渲染。但是我们依然可以把它用在游戏中,比如在地图编辑器中对静态光源和大型静态场景进行预渲染,如果光源是变化的,那么对光源变化的过程采样,渲染后在通过插值计算来模拟光源变化。通过基于光线追踪计算出的图像,具有很高的光真实感,可以令用户产生赏心悦目的感受。

[photonmap实时渲染方案的想法]

1 区别于静态渲染,不是一次发射所有必须的光子,而是只产生少量的光子,把相关信息保存在光子图中,然后每桢逐步递加光子,过了一定时间以后,就抛弃旧的光子信息。

2 构造类似于windows脏矩形思想的脏光线算法。

光线跟踪是一种真实地显示物体的方法,该方法由Appel在1968年提出。光线跟踪方法沿着到达视点的光线的反方向跟踪,经过屏幕上每一个象素,找出与视线相交的物体表面点P0,并继续跟踪,找出影响P0点光强的所有光源,从而算出P0点上精确的光线强度,在材质编辑中经常用来表现镜面效果。 光线跟踪或称光迹追踪是计算机图形学的核心算法之一。在算法中,光线从光源被抛射出来,当他们经过物体表面的时候,对他们应用种种符合物理光学定律的变换。最终,光线进入虚拟的摄像机底片中,图片被生成出来。由于该算法是成像系统的完全模拟,所以可以模拟生成十分复杂的图片。 业界公认此算法为Turner Whitted在1980年提出。近日,世界主要国家的图形学学生都要实习此算法。他的一个著名的实现是开源软件。 【自然现象】 在自然界中,光源发出的光线向前传播,最後到达一个妨碍它继续传播的物体表面,我们可以将“光线”看作在同样的路径传输的光子流,在完全真空中,这条光线将是一条直线。但是在现实中,在光路上会受到三个因素的影响:吸收、反射与折射。物体表面可能在一个或者多个方向反射全部或者部分光线,它也可能吸收部分光线,使得反射或者折射的光线强度减弱。如果物体表面是透明的或者半透明的,那么它就会将一部分光线按照不同的方向折射到物体内部,同时吸收部分或者全部光谱或者改变光线的颜色。吸收、反射以及折射的光线都来自于入射光线,而不会超出入射光线的强度。例如,一个物体表面不可能反射 66% 的输入光线,然後再折射 50% 的输入光线,因为这二者相加将会达到 116%。这样,反射或者折射的光线可以到达其它的物体表面,同样,吸收、反射、折射的光线重新根据入射光线进行计算。其中一部分光线通过这样的途径传播到我们的眼睛,我们就能够看到最终的渲染图像及场景。 【光线跟踪算法】

下一个重要的研究突破是 Turner Whitted 于 1979 年做出的。以前的算法从眼睛到场景投射光线,但是并不跟踪这些光线。当光线碰到一个物体表面的时候,可能产生三种新的类型的光线:反射、折射与阴影。光滑的物体表面将光线按照镜像反射的方向反射出去,然後这个光线与场景中的物体相交,最近的相交物体就是反射中看到的物体。在透明物质中传输的光线以类似的方式传播,但是在进入或者离开一种物质的时候会发生折射。为了避免跟踪场景中的所有光线,人们使用阴影光线来测试光线是否可以照射到物体表面。光线照射到物体表面上的某些点上,如果这些点面向光线,那么就跟踪这段交点与光源之间的光线。如果在表面与光源之间是不透明的物体,那么这个表面就位于阴影之中,光线无法照射。这种新层次的光线计算使得光线跟踪图像更加真实。 【光线跟踪的优点】

光线跟踪的流行来源于它比其它渲染方法如扫描线渲染或者光线投射更加

能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是光线跟踪算法的一种自然结果。光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。 【光线跟踪的缺点】

光线跟踪的一个最大的缺点就是性能,扫描线算法以及其它算法利用了数据的一致性从而在像素之间共享计算,但是光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。尽管它正确地处理了相互反射的现象以及折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常紧似或者完全实现渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。 【实时光线跟踪】

人们已经进行了许多努力,改进如计算机与视频游戏这些交互式三维图形应用程序中的实时光线跟踪速度。

OpenRT 项目包含一个高度优化的光线跟踪软件内核,并且提供了一套类似于 OpenGL 的 API 用于替代目前交互式三维图形处理中基于rasterization 的实现方法。

一些光线跟踪硬件,如斯坦福大学开发的实验性的光线处理单元,都是设计成加速光线跟踪处理中那些需要大量计算的操作。 自从二十世纪九十年代末开始,一些 demo programmers 爱好者就已经开发了一些光线跟踪的实时三维引擎软件。但是,demos 中的光线跟踪为了实现足够高的帧速经常使用一些不正确的近似甚至是欺骗的手段。[1] 【光学设计中的光线跟踪】

计算机图形学中的光线跟踪的名称与原理源自于二十世纪最初十年就已经开始出现的光学镜头设计中的古老技术。几何光线跟踪用于描述光线通过镜头系统或者光学仪器时的传输特性,并建立系统的成像属性模型。这用于建造前优化光学仪器的设计,例如减少色像差或者其它的光学像差。光线跟踪也用于计算光学系统中的光程差,光程差用于计算光学波前,而光学波前用于计算系统的衍射作用,例如点扩展函数、调制传递函数以及 Strehl ratio。光线跟踪不仅用于摄影领域的镜头设计,也可以用于微波设计甚至是无线电系统这样的较长波长应用,也可以用于紫外线或者X射线光学这样的较短波长领域。

计算机图形学与光学设计领域所用的光线跟踪的基本原理都是类似的,但是光学设计所用的技术通常更加严格,并且能够更加正确地反映光线行为。尤其是光的色散、衍射效应以及光学镀膜的特性在光学镜头设计中都是非常重要的,但是在计算机图形学领域就没有那么重要了。 在计算机出现以前,光线跟踪需要使用三角以及对数表手工计算,许多传统摄影镜头的光学公式都是许多人共同完成优化的,每个人只能处理其中一小部分的计算工作。现在这些计算可以在如来自于 Lambda Research 的 OSLO 或者 TracePro、Code-V 或者 Zemax 这些光学设计软件上完成。一个简单的光线跟踪版本是光线传递矩阵分析,它通常用于激光光学谐振腔的设计。

1) ray tracing 光线跟踪法

1.The ray tracing and Monte Carlo method are applied to calculate the distribution of deposited pumping energy within a rod amplifier of the high power solid state laser system.

建立了用蒙特卡罗和光线跟踪法计算高功率固体激光系统棒状放大器能量沉积分布的模拟程序。

2) curved ray tracing method 弯曲光线跟踪法

3) numerical curved ray tracing method 数值弯曲光线跟踪法 1.The numerical curved ray tracing method is employed to solve the thermal radiation transfer.

对具有吸收-透射性边界面的梯度折射率半透明介质层,建立了介质内热辐射传递与边界面辐射换热的数理模型,并采用数值弯曲光线跟踪法求解介质内的热辐射传递。 4) ray 光线

1.When light transmits through aeolotropiccrystal,as far as

extraordinary light is concerned,there is a smaller included angle between the ray and the wave normal in general,which is usually called walk-off angle.

光在各向异性晶体中传播时,e光的光线方向与光波法线方向一般有一个较小的夹角,即离散角α。 5) light 光线

1.Light,Size and Scale of Artists Studio for Classical Oil Painting New Studio of Chinese Academy of Oil Painting,Beijing;

古典油画艺术家工作室光线及尺度研究 北京中国油画院艺术家新工作室设计 2.New Lighting Architectural and Urban Lightscape; 新光线 建筑与城市景观照明

3.In a film,light is used to establish.

电影中的光线,决定场景的气氛效果,帮助画面构图。 6) light ray 光线

1.Using geometrical method to calculate the gravitational deflection of light ray in the static spherically symmetric gravitational field; 静态球对称引力场中光线偏折的几何算法

2.The reflection formulas of the ordinary and extraordinary light are given for determining their reflecting orientation of the wave normal and the light ray.

基于电磁波边界条件 ,从几何光学的角度 ,对单轴晶体内表面上光的反射规律进行了分析和讨论 ,给出了寻常光和非常光波法线和光线反射的公式同时指出

了上述结果与由费马原理导出的结果是一致

3.And the refraction formulas of the light ray are derived by the Fermat s principle which is suited for the uniaxial crystal.

对两单轴晶体交界面上光的折射,根据光的电矢量满足的边界条件,得到了波法线满足的折射公式,同时,根据度规光学中光线径迹的零测地线方程导出的Fermat原理,推得了光线遵从的折射定律。

折射

光波穿过不同的介质的时候传播方向会发生变化就是折射(refraction)。 光的折射 物理意义

1、光的折射:光从一种透明介质斜射入另一种透明介质时,传播方向一般会发生变化,这种现象叫光的折射 理解:光的折射与光的反射一样都是发生在两种介质的交界处,只是反射光返回原介质中,而折射光则进入到另一种介质中,由于光在在两种不同的物质里传播速度不同,故在两种介质的交界处传播方向发生变化,这就是光的折射。 注意:在两种介质的交界处,既发生折射,同时也发生反射。反射光光速与入射光相同反射光环,折射光光速与入射光不同。 现象:

鱼儿在清澈的水里面游动,可以看得很清楚.然而,沿着你看见与的方向去叉它,却叉不到.有经验的渔民都知道,只有瞄准鱼的下方才能把鱼叉到.

从上面看水,玻璃等透明介质中的物体,会感到物体的位臵比实际位臵高一些.这是光的折射现象引起的.

由于光的折射,池水看起来比实际的浅.所以,当你站在岸边,看见清澈见底,深不过齐腰的水时,千万不要贸然下去,以免因为对水深估计不足,惊慌失措,发生危险.

把一块厚玻璃放在钢笔的前面,笔杆看起来好像\错位\了,这种现象也是光的折射引起的.

2、光的折射定律:光从空气斜射入水或其他介质中时,反射光线与入射光线、法线在同一平面上,折射光和入射光分居法线两侧;折射角小于入射角;入射角增大时,折射角也随着增大;当光线垂直射向介质表面时,传播方向不变,在折射中光路可逆。当光从水或其他介质中斜射入空气时,折射角大于入射角。 理解:折射规律分三点:(1)三线一面(2)两线分居(3)两角关系分三种情况:①入射光线垂直界面入射时,折射角等于入射角等于0°;②光从空气斜射入水等介质中时,折射角小于入射角;③光从水等介质斜射入空气中时,折射角大于入射角(但存在于空气中的角总是一个大角) 3、 在光的折射中光路是可逆的 4、 透镜及分类

透镜:透明物质制成(一般是玻璃),至少有一个表面是球面的一部分,且透镜厚度远比其球面半径小的多。

分类:凸透镜:边缘薄,中央厚凸透镜 凹透镜:边缘厚,中央薄

5、 主光轴,光心、焦点、焦距 主光轴:通过两个球心的直线

光心:主光轴上有个特殊的点,通过它的光线传播方向不变。(透镜中心可认为是光心) 焦点:凸透镜能使跟主轴平行的光线会聚在主光轴上的一点,这点叫透镜的焦点,用“F”表示 虚焦点:跟主光轴平行的光线经凹透镜后变得发散,发散光线的反向延长线相交在主光轴上一点,这一点不是实际光线的会聚点,所以叫虚焦点。 焦距:焦点到光心的距离叫焦距,用“f”表示。 每个透镜都有两个焦点、焦距和一个光心。 6、 透镜对光的作用

凸透镜:对光起会聚作用(如图)

凹透镜:对光起发散作用(如图)凹透镜 7、 凸透镜成像规律 物 距 成像大小 (u)

像的虚实 应 用 像物位臵 像 距 ( v )

u > 2f 缩小 实像 透镜两侧 f < v <2f 照相机 u = 2f 等大 实像 透镜两侧 v = 2f

f < u <2f 放大 实像 透镜两侧 v > 2f 幻灯机 u = f 不 成 像

u < f 放大 虚像 透镜同侧 v > u 放大镜

凸透镜成像规律:虚像物体同侧;实像物体异侧;物远实像小而近物近实像大而远。

8、 为了使幕上的像“正立”(朝上),幻灯片要倒着插。凸透镜成像规律 9、照相机的镜头相当于一个凸透镜,暗箱中的胶片相当于光屏,我们调节调焦环,并非调焦距,而是调镜头到胶片的距离,物离镜头越远,胶片就应靠近镜头

介质对光的折射率:[绝对折射率] 光从真空射入介质发生折射时,入射角i与折射角r的正弦之比n叫做介质的“绝对折射率”,简称“折射率”。 n=sini/sinr

它表示光在介质中传播时,介质对光的一种特征。 介质对介质的折射率:[相对折射率] 光从介质1射入介质2发生折射时,入射角θ1与折射角θ2的正弦之比n21叫做介质2相对介质1的折射率,即“相对折射率”。因此,“绝对折射率”可以看作介质相对真空的折射率。 n'=sinθ1/sinθ2=n2/n1

它是表示在两种(各向同性)介质中光速比值的物理量。

光线跟踪(en:Ray tracing)来自于几何光学的一项通用技术,它通过跟踪与光学表面发生交互作用的光线从而得到光线经过路径的模型。它用于光学系统设计,

如照相机镜头、显微镜、望远镜以及双目镜等。这个术语也用于表示三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以当追求这样高质量结果时候经常使用这种方法。

光线跟踪计算机算法的一般描述

反射地板并且相互反射的三个球体为了生成在三维计算机图形环境中的可见图像,光线跟踪是一个比光线投射或者扫描线渲染更加逼真的实现方法。这种方法通过逆向跟踪与假象的照相机镜头相交的光路进行工作,由于大量的类似光线横穿场景,所以从照相机角度看到的场景可见信息以及软件特定的光照条件,就可以构建起来。当光线与场景中的物体或者媒介相交的时候计算光线的反射、折射以及吸收。

光线跟踪的场景经常是由程序员用数学工具进行描述,也可以由视觉艺术家使用中间工具描述,也可以使用从数码相机等不同技术方法捕捉到的图像或者模型数据。

由于一个光源发射出的光线的绝大部分不会在观察者看到的光线中占很大比例,这些光线大部分经过多次反射逐渐消失或者至无限小,所以对于构建可见信息来说,逆向跟踪光线要比真实地模拟光线相互作用的效率要高很多倍。计算机模拟程序从光源发出的光线开始查询与观察点相交的光线从执行与获得正确的图像来说是不现实的。

这种方法的一个明显缺点就是需要假设光线在观察点处终止,然后进行逆向跟踪。在一定数量的最大反射之后,最后交点处的光线强度使用多种算法进行估计,这些算法可能包括经典的渲染算法,也可能包括如辐射着色这样的技术。

光线跟踪计算机算法及其起源的详细描述

自然现象 在自然界中,光源发出的光线向前传播,最后到达一个妨碍它继续传播的物体表面,我们可以将“光线”看作在同样的路径传输的光子流,在完全真空中,这条光线将是一条直线。但是在现实中,在光路上会受到三个因素的影响:吸收、反射与折射。物体表面可能在一个或者多个方向反射全部或者部分光线,它也可能吸收部分光线,使得反射或者折射的光线强度减弱。如果物体表面是透明的或者半透明的,那么它就会将一部分光线按照不同的方向折射到物体内部,同时吸收部分或者全部光谱或者改变光线的颜色。吸收、反射以及折射的光线都来自于入射光线,而不会超出入射光线的强度。例如,一个物体表面不可能反射 66% 的输入光线,然后再折射 50% 的输入光线,因为这二者相加将会达到 116%。这样,反射或者折射的光线可以到达其它的物体表面,同样,吸收、反射、折射的光线重新根据入射光线进行计算。其中一部分光线通过这样的途径传播到我们的眼睛,我们就能够看到最终的渲染图像及场景。

光线投射算法

Arthur Appel 于 1968 年首次提出用于渲染的光线投射算法。光线投射的基础就是从眼睛投射光线到物体上的每个点,查找阻挡光线的最近物体,也就是将图像当作一个屏风,每个点就是屏风上的一个正方形。通常这就是眼睛看到的那个点的物体。根据材料的特性以及场景中的光线效果,这个算法可以确定物体的浓淡效果。其中一个简单假设就是如果表面面向光线,那么这个表面就会被照亮而不会处于阴影中。表面的浓淡效果根据传统的三维计算机图形学的浓淡模型进行计算。光线投射超出扫描线渲染的一个重要优点是它能够很容易地处理非平面的表面以及实体,如圆锥和球体等。如果一个数学表面与光线相交,那么就可以用光线投射进行渲染。复杂的物体可以用实体造型技术构建,并且可以很容易地进行渲染。

位于纽约 Elmsford, New York Mathematical Applications Group, Inc.(MAGI)的科学家首次将光线投射技术用于生成计算机图形。1966 年,为了替美国国防部计算放射性污染创立了这个公司。MAGI 不仅计算了伽马射线如何从表面进行反射(辐射的光线投射自从二十世纪四十年代就已经开始计算了),也计算了它们如何穿透以及折射。这些研究工作帮助政府确定一些特定的军事应用;建造能够保护军队避免辐射的军用车辆,设计可以重入的太空探索交通工具。在 Philip Mittelman 博士的指导下,科学家们开发了一种使用同样基本软件生成图像的方法。1972 年,MAFI 转变成了一个商业动画工作室,这个工作室使用光线投射技术为商业电视、教育电影以及最后为故事片制作三维计算机动画,他们全部使用光线投射制作了 Tron 电影中的绝大部分动画。MAGI 于 1985 年破产。

光线跟踪算法

下一个重要的研究突破是 Turner Whitted 于 1979 年做出的。以前的算法从眼睛到场景投射光线,但是并不跟踪这些光线。当光线碰到一个物体表面的时候,可能产生三种新的类型的光线:反射、折射与阴影。光滑的物体表面将光线按照镜像反射的方向反射出去,然后这个光线与场景中的物体相交,最近的相交物体就是反射中看到的物体。在透明物质中传输的光线以类似的方式传播,但是在进入或者离开一种物质的时候会发生折射。为了避免跟踪场景中的所有光线,人们使用阴影光线来测试光线是否可以照射到物体表面。光线照射到物体表面上的某些点上,如果这些点面向光线,那么就跟踪这段交点与光源之间的光线。如果在表面与光源之间是不透明的物体,那么这个表面就位于阴影之中,光线无法照射。这种新层次的光线计算使得光线跟踪图像更加真实。

光线跟踪的优点

光线跟踪的流行来源于它比其它渲染方法如扫描线渲染或者光线投射更加能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是光线跟踪算法的一种自然结果。光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。

光线跟踪的缺点

光线跟踪的一个最大的缺点就是性能,扫描线算法以及其它算法利用了数据的一致性从而在像素之间共享计算,但是光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。但是,这种独立的做法也有一些其它的优点,例如可以使用

更多的光线以抗混叠现象,并且在需要的时候可以提高图像质量。尽管它正确地处理了相互反射的现象以及折射等光学效果,但是传统的光线跟踪并不一定是真实效果图像,只有在非常紧似或者完全实现渲染方程的时候才能实现真正的真实效果图像。由于渲染方程描述了每个光束的物理效果,所以实现渲染方程可以得到真正的真实效果,但是,考虑到所需要的计算资源,这通常是无法实现的。于是,所有可以实现的渲染模型都必须是渲染方程的近似,而光线跟踪就不一定是最为可行的方法。包括光子映射在内的一些方法,都是依据光线跟踪实现一部分算法,但是可以得到更好的效果。

光线穿过场景的反方向

从眼睛发出光线到达光源从而渲染图像的过程有时也称为后向光线跟踪,这是因为它是实际光线传播方向的反方向。但是,对于这个术语来说还有一些混淆的地方。早期的光线跟踪经常是从眼睛开始,James Arvo 等早期研究人员用后向光线跟踪表示从光源发出光线然后收集得到的结果。因为如此,将它们分成基于眼睛或者基于光源的光线跟踪将会更加清楚。在过去的几十年中,研究人员已经开发了许多组合了这两种方向的计算方法与机制以生成投降或者偏离交叉表面的或多或少的光线。例如,辐射着色算法通常根据光源对于表面的影响进行计算并且存储这些结果,然后一个标准的递归光线跟踪器可以使用这些数据生成场景的真实、物理正确的图像。在全局照明算法如光子映射以及 Metropolis light transport 中,光线跟踪只是一个用来计算光线在表面之间传输的简单工具。 实时光线跟踪

人们已经进行了许多努力,改进如计算机与视频游戏这些交互式三维图形应用程序中的实时光线跟踪速度。

OpenRT 项目包含一个高度优化的光线跟踪软件内核,并且提供了一套类似于 OpenGL 的 API 用于替代目前交互式三维图形处理中基于位图化(rasterization)的实现方法。

一些光线跟踪硬件,如 Saarland 大学开发的实验性光线处理单元,都是设计用来加速光线跟踪处理中那些需要大量计算的操作。

自从二十世纪九十年代末开始,一些 demo programmers 爱好者就已经开发了一些光线跟踪的实时三维引擎软件。但是,demos 中的光线跟踪为了实现足够高的帧速经常使用一些不正确的近似甚至是欺骗的手段。[1]

光学设计中的光线跟踪

计算机图形学中的光线跟踪的名称与原理源自于二十世纪最初十年就已经开始出现的光学镜头设计中的古老技术。几何光线跟踪用于描述光线通过镜头系统或者光学仪器时的传输特性,并建立系统的成像属性模型。这用于建造前优化光学仪器的设计,例如减少色像差或者其它的光学像差。光线跟踪也用于计算光学系统中的光程差,光程差用于计算光学波前,而光学波前用于计算系统的衍射作用,例如点扩展函数、调制传递函数以及 Strehl ratio。光线跟踪不仅用于摄影领域的镜头设计,也可以用于微波设计甚至是无线电系统这样的较长波长应用,也可以用于紫外线或者X射线光学这样的较短波长领域。

计算机图形学与光学设计领域所用的光线跟踪的基本原理都是类似的,但是光学设计所用的技术通常更加严格,并且能够更加正确地反映光线行为。尤其是光的色散、衍射效应以及光学镀膜的特性在光学镜头设计中都是非常重要的,但是在计算机图形学领域就没有那么重要了。

在计算机出现以前,光线跟踪需要使用三角以及对数表手工计算,许多传统摄影镜头的光学公式都是许多人共同完成优化的,每个人只能处理其中一小部分的计算工作。现在这些计算可以在如来自于 Lambda Research 的 OSLO 或者 TracePro、Code-V 或者 Zemax 这些光学设计软件上完成。一个简单的光线跟踪版本是光线传递矩阵分析,它通常用于激光光学谐振腔的设计。

例子

为了说明光线跟踪所用的基本原理,我们来看计算一个光线与球体交点的例子。用 I 表示球面上的点,C 表示球心,r 表示半径,那么球面的公式为 }-. 如果定义一条线的起点即光线起点是 S,方向是 d,那么线上的每个点都可以表示为

其中 t 是定义线上与起点距离的常数,为了简化起见,通常 d 定义为单位向量。那么,在这种情况下已知 S、d、C 以及 r,于是代入 I 得到:

}-

简化

}- ,那么

那么二次方程的解是

这只是直线光线与球体交点的所用的数学公式,当然对于通用的光线跟踪来说是远远不够的,但是它至少表示了这个算法如何使用的一个实例。

Radiosity (辐射着色)

这是一种类似光线跟踪的特效。它通过制定在场景中光线的来源并且根据物体的位臵和反射情况来计算从观察者到光源的整个路径上的光影效果。在这条线路上,光线受到不同物体的相互影响,如:反射、吸收、折射等情况都被计算在内。

本文来源:https://www.bwwdw.com/article/dnx5.html

Top