Ray Tracing
(1)为什么使用光线追踪
- Ray Tracing 和 Rasterization 是两种不同的成像方式。
- Rasterization最大的问题:不利于表达全局效果。
- 整体来说光栅化做阴影是比较困难的。
- Glossy reflection:一种不那么光滑的反射镜面。
- Indirect illumination间接光照:指光进入人眼前经过多次反射(≥2)。
虽然有许多办法能使得光栅化解决以上问题,但它们是很复杂并且麻烦的,最重要的是它们在物理上并不具有正确性。这就是光栅化的局限性。
(2)光线追踪的局限性
- 光线追踪依据真实物理规律,模拟真实进行渲染,带来非常真实的视觉效果。
- 光线追踪多用于离线生成画面,因为它的速度是非常慢的,一帧就需要生成很久。
- 光栅化不能被光线追踪所替代,是因为它的速度非常快,可以进行实时的生成。
(3)光线追踪的定义
- 光沿着直线传播。
- 光线和光线不会发生碰撞。
- 光线追踪运用光路的可逆性。
- 光线从光源发出,会发生反射、折射,光线追踪就是模拟这个过程。
追踪:从终点(眼睛或相机)开始,连接到视口上的每一个像素。连接会产生一条光路,我们沿着每条光路追踪场景中的物体。
如果追踪到某个物体,我们再将物体和光源进行连线,判断物体是否能被光源照亮。
如果物体能被光源照亮,那么我们就可以计算这条光路上的能量,随着进行着色。
(4)进行光线追踪
- 沿着eye ray找到光路上最近的物体。
- 将最近的物体和光源连线,判断对光源是否可见。
- 如果可见,根据物体法线计算颜色,写回像素中:
(5)Whitted-Style Ray Tracing
- 以上的光线追踪同样只考虑了光线反弹一次。
- Whitted-Style模拟了光线不断弹射的过程:
(6)技术实现
6.1光线
- 光线的表示:
6.2光线和圆的交点
- 和圆的交点:
6.3光线和隐式几何的交点
- 光线和隐式表面的交点。
- 要求解出t为实数,并且为正(眼睛的正向)。
6.4光线和三角形的交点
-
判断一个点在封闭图形内,可以通过这个点想外做一条射线,如果和封闭图形交点数位偶数则在外部,如果为奇数则在内部。这个结论在三维也成立。
-
光线和平面求交,判断交点是否在三角形内。
-
平面的表示:
-
平面和光线的交点:
-
加速算法如下。解出来要求t为正,b1、b2、b3也为正。
(7) 光线和面的交点
7.1包围盒
-
一个物体包含大量三角形,在求三角形面和光线的交点时,我们需要进行加速。
-
包围盒Bounding Volumes:
-
使用前后左右上下六个面,即三对面去表示一个包围盒:
-
在二维中我们要包围一个形体,使用一个包围面即可,如下图中在xy平面我们想要包围一个物体。我们具有一个面两对边,我们使用光线和竖直的两条对边求交点得到一对交点,使用光线和水平的两条对边求交点得到一对交点。我们对tmin取最大,对tmax取最小,得到它们两条线段的交集。这个交集就是光线在包围面中穿梭的路程。
-
在三维世界中,包围盒是三个对面。
-
只有当光线进入了所有的对面时,光线才进入了盒子。
-
只要光线离开了任意一组对面时,光线就离开了盒子。