--- title: "Whitted-style光线追踪(Whitted-style Ray Tracing)" date: 2022-07-19T16:04:37+08:00 --- ### 使用光线追踪的原因 1. 光栅化无法很好地处理全局效果 1. 软阴影 2. 光线产生多次反弹 2. 光栅化处理速度快但质量相对较低 3. 光线追踪处理精准,但速度较低 1. 光栅化:实时渲染,光线追踪:离线渲染 2. 在生产环境中渲染一帧往往需要~10kCPU核心时 ### 光线 1. 光线沿直线传播(虽然是错误的) 2. 光线在相交时互不影响(虽然也是错的) 3. 光线从光源传播到眼睛(且光路是可逆的) ### Ray Casting 1968年由Appel提出 1. 通过每个像素投射一条光线的方式来生成图像 2. 通过向光源发送光线的方式来生成阴影 ![](../../images/Ray_Casting_theory.png) #### 生成视角射线(Generating Eye Rays) Pinhole Camera Model ![](../../images/Ray_Casting_Generate_Eye_Ray.png) #### 着色像素(shading pixel) ![](../../images/Ray_Casting_shading_pixel.png) ### 递归式光线追踪(Recursive Ray Tracing) Recursiv Ray Tracing 又名 Whitted-Style Ray Tracing 由T.Whitted在1980年提出 "An improved Illumination model for shaded display" ![](../../images/eg_Recursive_Ray_Tracing.png) 总体计算流程 ![](../../images/Recursive_Ray_Tracing_progress.png) ------------------------------------------- #### 射线表面相交计算(Ray-Surface Intersection) 在进行射线表面相交计算前我们需要了解射线方程(Ray Equation) ##### Ray Equation and Plane Equation 射线:由一个起点和一个方向向量定义 对应的射线方程(Ray Equation)为: $$r(t) = o +td , \\ \\ \\ \\ 0\leq t < 100 $$ r:沿射线的点 t:"时间" o:起始点 d:归一化后的方向向量 ----------------- 平面:由一个法线向量和在平面上的点定义 对应的平面方程(Plane Equation)为: $$P:(p - p') * N = 0,\\ \\ \\ ax+by+cz+d = 0$$ p:所有在平面上的点 p':在平面上的一个点 N:法线向量 ##### 射线与球体相交(Ray Intersection With Sphere) 射线:$r(t) = o +td , \\ \\ \\ \\ 0\leq t < 100 $ 球体:$p:(p-c)^2 - R^2 = 0 $ 当射线与球体相交时,交点$p$必须同时满足射线和球体的方程 此时的解为: $$(o + td - c )^2 - R^2 = 0$$ ##### 射线与隐式曲面相交(Ray Intersection With Implict Surface) 射线:$r(t) = o +td , \\ \\ \\ \\ 0\leq t < 100 $ 一般隐式曲面:$p:f(p) = 0$ 代入后的替代射线方程:$f(o + td) = 0$ !解必须为正根 ##### 射线与三角形网格相交(Ray Intersection With Triangle Mesh) 原因: 1. 渲染上:计算可见性,阴影,光照 2. 几何上:判断内外关系 计算:拆分 1. 最简单的方式:对每个三角形进行一次相交判断 2. 最简单但速度最慢 3. 可以出现0次相交或一次相交 ##### 射线与三角形相交(Ray Intersection With Triangle) 三角形可以视为在一个平面中 1. 可视为射线与平面相交 2. 判断相交点是否位于三角形内部即可 ##### 射线与平面相交(Ray Intersection With Plane) 射线方程:$r(t) = o +td , \\ \\ \\ \\ 0\leq t < 100 $ 平面方程:$P:(p - p') * N = 0,\\ \\ \\ ax+by+cz+d = 0$ 相交的解为: 设$p = r(t)$求解$t(0\leq t < \infty)$ $(p-p') * N = (o + td - p') * N = 0$ $t = \frac{(p'-o) * N }{d * N}$ ![](../../images/Ray_Intersection_With_Plane.png) ##### Möller Trumbore Algorithm 一种更快地得出重心坐标的算法 ![](../../images/Möller_Trumbore_Algorithm.png) ### 光线追踪的性能瓶颈 通过简单地计算光线与场景的相交的方式: 1. 需要对场景中每一个三角形判断光线是否相交 2. 找到最接近的交点(即最小的t值) 带来的问题: 1. 算法复杂度 = $pixels \times triangles (\times bounces)$ 2. 计算耗时极高 解决办法: 1. 采取遍历物体而非三角形的方式进行计算 2. 采用相关加速结构/算法 ---------------------------------------