引言.引入光线追踪的目的
1. 光栅化不易实现一些全局的效果
(1)阴影
(2)漫反射效果
(3)场景中的间接光照
2. 光栅化速度快,但真实感相对较差
光线追踪更符合物理规律,但计算量大。
一.基础光线追踪算法
1. 模型假设
(1)光线沿直线传播
(2)光线不会发生碰撞(两道光线交叉后,仍分别沿原方向传播)
(3)光路具有可逆性(光线从光源发出,经过一系列反射折射损耗,最终进入人眼)
2. 基本思路
(1)沿“视点” → “屏幕上的像素” 方向往场景中做射线。
(2)若而已eye ray 与场景中的物体有交点,则将该点与光源做一个连线。判断中间是否有其他物体阻挡:若有,该点在阴影里。若无,则通过着色模型计算该点着色。
(3). Whitted-风格 光线追踪(Whitted - Styled)
【1】光线在场景会被多次反射,折射。
【2】路径上的每个交点都做一次着色,然后叠加到像素上。
【3】考虑光线传播过程中的能量损失。
二. 具体实现
1. 光线与物体求交
(1)求光线与隐式表面的交点
求方程组的解,解得时间 t。
(2)求光线与显示表面的交点
方法:光线与三角形求交
思路:
[1].光线和平面求交
[2].判断交点是否在三角形内 — Moller Trumbore 算法
其中P1, P2, P3 分别是三角形的三个顶点。
求解出 t, b1, b2。
当解满足
b1 >= 0
b2 >= 0
(1 - b1 - b2) >= 0
t >= 0
时,求出的交点在三角形中。
2. 加速光线与物体表面求交的过程
(1) 采用包围盒方法(Bounding Volumes)
包围盒完完全全将物体包围,因而,当光线与包围和没有交点的情况下,也绝不会和物体有交点。
(2)判断光线与包围盒是否有交点
当光线满足与包围盒的三组对面都有交点时,可认定光线与包围盒有交点。
相当于求解,光线与三组对面相交的时间t
每组对面都可以求解出一个tmin 与 tmax。
·取t_enter = max(tmin) 表示光线进入包围盒的时间。
·取t_exit = min(tmax) 表示光线离开包围盒的时间。
·最后判断 若 t_exit < t_enter,则可认为光线穿过包围盒。
另外还需注意:
若t_exit < 0 则表示,包围盒在光线的反方向。
若t_exit >= 0, t_enter < 0,则认为光源在包围盒中。
综上,仅当 t_enter < t_exit && t_exit >= 0时,可判定光线穿过包围盒。
参考文档
【1】. https://www.bilibili.com/video/BV1X7411F744?p=13
【2】. http://games-cn.org/graphics-intro-ppt-video/