在光线跟踪算法的递归过程中
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在光线跟踪算法的递归过程中,加速算法有哪几种?说明他们分别使用与哪些场合光线跟踪的基本原理
由光源发出的光到达物体表面后,产生反射和折射,简单光照明模型和光透射模型模拟了这两种现象。在简单光照明模型中,反射被分为理想漫反射和镜面反射光,在简单光透射模型把透射光分为理想漫透射光和规则透射光。由光源发出的光称为直接光,物体对直接光的反射或折射称为直接反射和直接折射,相对的,把物体表面间对光的反射和折射称为间接光,间接反射,间接折射。这些是光线在物体之间的传播方式,是光线跟踪算法的基础。
最基本的光线跟踪算法是跟踪镜面反射和折射。从光源发出的光遇到物体的表面,发生反射和折射,光就改变方向,沿着反射方向和折射方向继续前进,直到遇到新的物体。但是光源发出光线,经反射与折射,只有很少部分可以进入人的眼睛。因此实际光线跟踪算法的跟踪方向与光传播的方向是相反的,而是视线跟踪。由视点与象素(x,y)
发出一根射线,与第一个物体相交后,在其反射与折射方向上进行跟踪,如图4.
6.1所示。
图4.6.1 基本光线跟踪光路示意
为了详细介绍光线跟踪算法,我们先给出四种射线的定义与光强的计算方法。在光线跟踪算法中,我们有如下的四种光线:视线是由视点与象素
(x,y)发出的射线;阴影测试线是物体表面上点与光源的连线;以及反射光线与折射光线。当光线V与物体表面交于点P时,点P分为三部分,把这三部分光强相加,就是该条光线V在P点处的总的光强:
a) 由光源产生的直接的光线照射光强,是交点处的局部光强,可以由下式计算:
b) 反射方向上由其它物体引起的间接光照光强,由
I s K s'计算,I s通过对反射光线的递归跟踪得到
c) 折射方向上由其它物体引起的间接光照光强,由I t K t'计算,I t通过对折射光线的递归跟踪得到。
在有了上面介绍的这些基础之后,我们来讨论光线跟踪算法本身。我们将对一个由两个透明球和一个非透明物体组成的场景进行光线跟踪(图4.6.2)通过这个例子,可以把光线跟踪的基本过程解释清楚。
图4.6.2 光线跟踪算法的基本过程
在我们的场景中,有一个点光源L,两个透明的球体O
1与O2,一个不透明的物体O3。首先,从视点出发经过视屏一个象素点的视线E 传播到达球体O1,与其交点为P1。从P1向光源L作一条阴影测试线S1,我们发现其间没有遮挡的物体,那么我们就用局部光照明模型计算光源对P1在其视线E的方向上的光强,作为该点的局部光强。同时我们还要跟踪该点处反射光线R 1和折射光线T1,它们也对P1点的光强有贡献。在反射光线R1方向上,没有再与其他物体相交,那么就设该方向的光强为零,并结束这光线方向的跟踪。然后我们来对折射光线T1方向进行跟踪,来计算该光线的光强贡献。折射光线T1在物体O1内部传播,与O1相交于点P2,由于该点在物体内部,我们假设它的局部光强为零,同时,产生了反射光线R2和折射光线T2,在反射光线R2方向,我们可以继续递归跟踪下去计算它的光强,在这里就不再继续下去了。我们将继续对折射光线T2进行跟踪。T2与物体O3交于点P3,作P3与光源L的阴影测试线S3,没有物体遮挡,那么计算该处的局部光强,由于该物体是非透明的,那么我们可以继续跟踪反射光线R3方向的光强,结合局部光强,来得到P3处的光强。反射光线R3的跟踪与前面的过程类似,算法可以递归的进行下去。重复上面的过程,直到光线满足跟踪终止条件。这样我们就可以得到视屏上的一个象素点的光强,也就是它相应的颜色值。
上面的例子就是光线跟踪算法的基本过程,我们可以看出,光线跟踪算法实际上是光照明物理过程的近似逆过程,这一过程可以跟踪物体间的镜面反射光线和规则透射,模拟了理想表面的光的传播。
虽然在理想情况下,光线可以在物体之间进行无限的反射和折射,但是在实际的算法进行过程中,我们不可能进行无穷的光线跟踪,因而需要给出一些跟踪的终止条件。在算法应用的意义上,可以有以下的几种终止条件:
•该光线未碰到任何物体。
•该光线碰到了背景。
•光线在经过许多次反射和折射以后,就会产生衰减,光线对于视点的光强贡献很小(小于某个设定值)。
•光线反射或折射次数即跟踪深度大于一定值。
最后我们用伪码的形式给出光线跟踪算法的源代码。光线跟踪的方向与光传播的方向相反,从视点出发,对于视屏上的每一个象素点,从视点作一条到该象素点的射线,调用该算法函数就可以确定这个象素点的颜色。光线跟踪算法的函数名为RayTracing(),光线的起点为start,光线的方向为direction,光线的衰减权值为weight,初始值为1,算法最后返回光线方向上的颜色值color。
对于每一个象素点,第一次调用RayTracing()时,可以设起点start为视点,而direction为视点到该象素点的射线方向。
RayTracing(start, direction, weight, color)
{
if ( weight < MinWeight )
color = black;
else
{
计算光线与所有物体的交点中离start最近的点;
if ( 没有交点 )
color = black;
else
{
Ilocal = 在交点处用局部光照模型计算出的光强;
计算反射方向R;
RayTracing(最近的交点, R, weight*Wr, Ir);
计算折射方向 T;
RayTracing(最近的交点, T, weight*Wt, It);
color = Ilocal + KsIr+ KtIt;
}
}
}
光线与物体的求交
对于反射光线与折射光线的方向计算问题,我们已经在前面的Whitted光透射模型中做了详细的介绍,在这里我们就不再讨论了。由于光线跟踪算法中需要用到大量的求交运算,因而求交运算的效率对于整个算法的效率影响很大,光线与物体的求交是光线跟踪算法的核心。我们将要在这一小节中按照不同物体的分类给出光线与物体的求交运算方法。
A.光线与球的求交
球是光线跟踪算法中最常用的体素,也是我们经常作为例子的物体,这是因为光线与球的交点很容易计算,特别是,球面的法向量总是从球心射出,无需专门的计算。另外,由于很容易进行光线与球的相交判断,所以球又常常用来作为复杂物体的包围盒。
设(x0,y0,z0)为光线的起点坐标,(x d,y d,z d)为光线的方向,并已经单位绍最基本的代数解法,以及为提高求交速度而设计的几何方法。
1)代数解法
首先我们用参数方程
来表示由点(x0,y0,z0)发出的光线,这t>=0。用隐式方程