课堂笔记_ 光线跟踪原理
Turner Whitted于1980年首次提出一个包含光反射和折射效果的模型:Whitted模型,并第一次给出光线跟踪算法的示例,是计算机图形学历史上的里程碑。发表于Communications of the ACM 1980。
定义:
特征:
通过光线跟踪,可以很容易地表现出例如阴影、反射、折射等引人入胜的视觉效果。除了基本的几何形状,(例如球体、椎体、立方体等),光线跟踪容易适用于更复杂的物体表示方法,(例如多边形网格表示或者符合形状等)
核心伪代码:
求交点,计算局部光照,判断折射反射方向,递归求解。
光线求交
光线的表示
光线与平面求交
光线与三角形求交
一般做法:
1.首先计算光线与三角形所在平面的交点;
2.判断交点是否在三角形的内部。
三角形与光线的交点可以通过结合重心坐标快速计算:
重心坐标的表示,在三角形内部的点P将三角形可以分为三个小三角形,分别用小三角形的面积除以大三角形的面积得到三个数来刻画P点的坐标。
可以通过线性求解得到交点的重心坐标以及直线参数t。
光线与多边形求交
不能像三角形那样方便的利用重心坐标计算,需要一个更普适的方法,即上边提到的首先计算光线与多边形所在平面的交点,然后判断这个交点是否在多边形内部。
注:交点在顶点的时候得考虑;光线方向是水平的。
最快的点包含判别算法–弧长法
按逆时针方向遍历多边形的每条边,每条边与点P形成一个角度,这个角度也是带符号的,上图中左边图形的角度之和为0,右边的图形角度之和为360度。但是求角度需要反三角函数,计算困难。好处是稳定,可靠性高,对于比较小的误差可以忽略
以被测点为圆心,作单位圆,计算其在单位圆上弧长的代数和。
–代数和为0:点在多边形外部。
–代数和为2
–代数和为
上述弧长法的主要缺点在于角度计算量,但是鲁棒性很好,对此提出改进的弧长法:
穿过两个象限:
光线与球面求交
1.代数方法求解:有可能出现奇异值导致的不稳定性
2.几何法求解:能快速判断光线与球面是否相交、光源是否在球体内部、光线的方向
这样求解鲁棒性好。
光线与长方体(包围盒)求交
Slab算法和Woo算法:复杂度类似。
光线追踪实现思路
光线投射
由视点向该像素中心投射一条光线,射向场景当中。对场景中的各个物体,计算与投射光线的交点,存储所有物体的交点中距离视点最近的一个。接着根据光照、物体材质、以及法向方向,使用局部光照模型计算像素颜色值。
明暗效果仅仅由第一次相交的物体表面法向方向、材质、视点和光照方向、以及光照强度等因素共同决定。而光线投射并不考虑第二层以及更深层次的光线,因此不具有阴影、反射、折射等效果。
添加阴影
当前的交点处发射一条光线(阴影测试线),阴影测试线射向光源,如果测试线被物体遮挡,则就在阴影下,否则不在阴影***意此处只是考虑与物体是否相交,而不关心具体的交点。
添加反射和折射效果
光线跟踪具有模拟物体表面反射效果以及折射效果的能力:
首先,计算光线与场景中物体的最近的交点。
然后,计算光线在交点处被物体反射和折射所产生的新的光线的方向,新的方向由入射光方向、物体表面法向、以及介质共同决定。
对新产生的管线(反射光线和折射光线)分别继续进行跟踪。
递归结束(一般三次):
1.在光线弹射一定次数后停止
2.在光线的贡献衰减到足够小时停止
添加纹理
一些问题思考
1.计算精度问题;
2.加速问题;
3.光线跟踪为什么要以视点来反向跟踪?如果按照光源发射的多条光线来计算,由于经过弹射最终能够抵达视点的光线是及其少的,得到的效果会很差,计算也很复杂。