按照why-what-how的组织结构来整理这一部分。
首先,为什么在有了光栅化的情况下还要研究光线追踪?
有以下几点原因:
1.光栅化不能很好的解决全局光照的效果问题,包括软阴影以及光线多次弹射的情况,光栅化解决的只有光源直接照射和第一次弹射的情况
2.光栅化虽然快但是质量不够高
当然,与光栅化相对的,光线追踪虽然效果很好但是计算很慢,需要大量的时间,哪怕是现在的实时光线追踪实际上帧数也不是很高。由于这样的特性,光线追踪一般是离线运用,例如电影中。
在我们whitted-style的光线追踪中,我们假定以下三个前提:
1.1光线沿着直线传播
1.2.光线之间并不会相交
1.3.光线从光源传播到人眼中,同时光路是可逆的
在古代,人们认为是眼睛发出了光线射到了世界中,从而让人们看到了事物。
当然物理学告诉我们事实上并不是这样的,我们只是普通的人类而不是超人(笑)。
但是这一点是我们可以借鉴用来实现光线追踪的想法。
根据上面的假设3,由于光线是可逆的,而我们想要看到物体就一定会有光线进入眼睛,那么我们不妨就假设是从我们的眼睛(摄像头)发出光线打到场景中去。
虎书中提到了这样的问题:一般来说将3d的物体投影到2d的平面上有两种方式,第一是对每个物体进行考虑,考虑它们对于屏幕的影响,例如光栅化
光线追踪采用的是
第二种,对于每一个像素进行考虑,对于每一个像素,物体对它们的影响都将被找到。那么接下来我们就综合上面两点,对于每一个像素,我们假定从摄像机发出光线穿过它到场景中,并最终判断它会呈现什么样的颜色。
对于每一个像素生成光线,接着检查这个点能否被看见。
我们如何检查这个点能否被看见?
被看见的条件有两个,第一,该点要能被光照到,第二,该点要能被摄像机看到
以上条件不满足任何一个该点都在阴影中
其中的几个前提假设:
2.1.摄像机是一个点
2.2.光线在物体上发生的是完美的反射和折射
如图就是上述方法,对于我们通过某个像素看到的某个点,我们可以通过光线打到的点来计算这个像素的颜色
但是我们知道在实际生活中,光并没有这么简单,光会发生反射和折射,当然根据我们的假设2.2使得计算简单了很多,对于这样的情况,我们也要将折射和反射后打到的物体考虑进去,这样我们的每一个像素的着色会更加准确。
同时,我们还要考虑的是能量守恒。
注意光线的不同名称,一开始发出的光线叫做 primary ray 经过反射折射的光线叫做 secondary ray
用来判断物体是否在阴影里的光线叫做shadow ray
-------------------------------------------------------------------------------------------------------------------------
以上我们有了大概的思路,接下来我们要实现的是通过数学来表示它们,这样我们才有办法在计算机上实现它们。
首先是对基本的光线的考虑。
由于光线存在光源,同时按照直线传播(假设1.1),我们可以自然的将光看作一条射线。
光线都可以用向量表示,o是起始点位置,t是行进的时间,d是方向单位向量
同时可以用一个单位向量表示
那么一条光线在t时间就可以表示为 o+td
有了数学表示接下来我们可以试试和隐式表达式求交来判断是否和物体相交。
以下是和球的求交:
实际上和隐式的几何物体求交是较为简单的,因为有表达式的情况下我们联立方程接着检验解的存在性和物理上的合理性之后就可以快速的判断该交点是否存在。
和显示几何物体求交:
任意取一个点,判断是否在物体内:
从该点发出一条射线,如果和物体的交点的个数是奇数,那么该点在物体内,如果是偶数,那么该点在物体外
这个规则在三维和二维均适用
如何判定光线和物体有无交点:
简单但是低效的方法:一个一个三角形去判断
高效的方法:bounding box 包围盒(加速结构)
判断和三角形的交:
可以先判断是否和三角形所在的平面是否相交,如果和平面都不相交,那么是不可能和三角形相交的。
三角形和光线求交:
分解为两步
1.判断光线和平面是否有交点
2.如果有,判断该交点是否在三角形内
要求时间是正的且是实数
一篇论文中提出了这样的快速的解法,在作业中同样用到了这样的解法。
加速结构:
bounding box 包围盒
二维平面中,我们可以把一个物体放在一个框内,(长方形框),该框可以看作两组互相平行的平面的交点
那么实际上,光线是否经过这个框,也就是光线是否经过这个物体,可以通过射线和这两组平行平面的关系来判定
什么时候光线算进入一组平面内部?
当光线在两个平面之间的时候
什么时候光线算进入该包围盒?
光线在两组平面之间的时候
先定义进入一组平面的时间为Tmin1,另外一组为Tmin2
当两组都进入时,即取两个Tmin中的最大值 记为Tmin
什么时候出该包围盒?
当光线出任意一个平面组的时候
假设出两组平面的时间设为Tmax1,Tmax2
取两个时间中的最小值的时候该光线出该包围盒 记为Tmax
为了方便描述,我们在该场景中暂且允许时间为负数,负数代表射线的反向延长线
当Tmin,Tmax均小于0时,可以判断该物体在光源的背面,自然不会与光源有交点
当Tmin>Tmax时,从物理意义上来说没有意义,故此时光线与物体也不相交
当Tmin<Tmax且Tmax>0时,光线有交点
此时,若Tmin<0则该光源在物体内部
若Tmin>0则光源在物体外部
对于三维的情况是一样的,只是把两组平面换成了三组平面
一般取这些平面都是与标准平面或者坐标轴平行的
成为AABB
iff当且仅当
采用AABB的好处:由于是在轴向上,可以减少计算量,只要算某个方向上的分量即可