Lecture 13: Ray Tracing(Whitted-Style Ray Tracing)
Why Ray Tracing?
- 光栅化无法很好地表示全局效果
- 软阴影
- 当光线多次反射的时候(包括间接光照)
- 光栅化很快,但其品质相对较低
- 光线追踪很准确,但是非常慢
- 光栅化:实时,光线追踪:离线
- 生成1帧需要10k个cpu小时
Light Rays(光线的定义/假设)
- 光线沿直线传播(尽管不那么正确)
- 如果光线交叉,彼此不发生碰撞(尽管也不那么正确)
- 光线一定从光源发出经过反射、折射最后到达我们的眼睛(同样光线具有可逆性)
古代西方:眼睛发出感知光线的理论(有一定道理)
Ray Casting (光线的投射)
Ray Casting - Generating Eye Rays
Ray Casting - Shading Pixels (Local Only)
Recursive (Whitted-Style) Ray Tracing (重点)
Recursive Ray Tracing
-
对于不同材质表面,一条光路经过时考虑(多次)折射和反射
-
如果光源能够照到光线的弹射点(折射或反射),则对应着色结果加入最后的图像
-
因此要通过shadow rays 计算每一个弹射点对于光源的可见性
-
而且要考虑距离导致的光线衰弱(因为能量守恒)
-
primary ray:由眼睛直接“打出”的光线
-
secondary ray:由眼睛“打出”一次弹射后的光线
-
接下类解决具体的技术问题
Ray-Surface Intersection (光线和物体表面的焦点)
Ray Equation (光线方程定义)
- 光线由其起点和方向定义
Ray Intersection With Sphere (光线和球的交点)
- 交点同时满足光线方程和球方程
Ray Intersection With Implict Surface (光线和隐式表面的交点)
Ray Intersection With Triangle Mesh (光线和三角形网格的交点)
为什么这么做
- 三角形网格是最重要的显示表面
- 渲染上:可见性,阴影,光照
- 几何上:测试某点发出的光线,若光线与物体交点为奇数,则该点在物体内部,否则在外部(推广到3d仍然可行,前提是物体应该为封闭的)
如何计算
- 简单的想法:就逐个三角形计算交点个数
- 简单但是比较慢(加速方法?)
- 注意:可以用0或1个交点(忽略恰好平行的情况)
Ray Intersection With Triangle
分解为两个问题
- 光线和平面的交点(问题)
- 交点是否在三角形内(做过)
Plane Equation (平面的定义)
- 平面基于一条法线和其经过的一个点定义
Ray Intersection With Plane
Moller Trumbore Algorithm
- 更一步到位的算法
- 只需要解出公式表示的线性方程组(使用克莱默法则)
- 要求t为正,重心坐标系数均为正
Accelerating Ray-Surface Intersection (光线表面求交点的加速)
- 像素×物体×弹射:逐个计算的原始方法太慢了!
- 怎么办呢?
Bounding Volumes (包围盒/包围体积)
- 如果光线碰不到包围盒,更加碰不到包围盒中的物体
- 三维中最常用的是长方体,理解成三组不同的对面的交集
- 通常我们使用轴对齐包围盒(AABB),长方体的轴沿着坐标轴
Ray Intersection with Axis-Aligned Box (判断光线和包围盒交点)
- 在二维中考虑
- 从两个轴方向上计算得到两组进入、出去的时间值,即为两个线段
- 求得两个线段的交集,即为光线实际进入和移出合资的时间
- 三维中考虑相似,即当光线进入全部三个对面时才进入,光线离开任意一个对面就算离开
- 即对各对面进入时间求max,对各对面离开时间求min
- 由此,如果进入时间<离开时间,则与盒子又交点,否则没有
其他问题
- 如果离开时间<0:盒子在光线“背后”——无交点
- 离开时间>=0,进入时间<0:一定有焦点
- 总结:光线和AABB有交点,当且仅当进入时间<离开时间 且 离开时间>=0
Why Axis-Aligned?
- 利用了当平面和轴垂直时计算更加容易,如下图: