--- 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. 通过向光源发送光线的方式来生成阴影 ![](https://lychee.inksoul.top/uploads/original/ec/04/414b90c3022c716d2624975c7704.webp) #### 生成视角射线(Generating Eye Rays) Pinhole Camera Model ![](https://lychee.inksoul.top/uploads/original/4d/43/8ebc04e289ec5c00933ebd6560cb.webp) #### 着色像素(shading pixel) ![](https://lychee.inksoul.top/uploads/original/93/78/eab871ac503716171d83ecdc6b22.webp) ### 递归式光线追踪(Recursive Ray Tracing) Recursiv Ray Tracing 又名 Whitted-Style Ray Tracing 由T.Whitted在1980年提出 "An improved Illumination model for shaded display" ![](https://lychee.inksoul.top/uploads/original/51/44/e45e88c6e723c9b5494970236959.webp) 总体计算流程 ![](https://lychee.inksoul.top/uploads/original/99/78/b546da5352d25210e62d0e3ddf57.webp) ------------------------------------------- #### 射线表面相交计算(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}$ ![](https://lychee.inksoul.top/uploads/original/f7/e2/6aedc56a7ccf58a5185b7577856b.webp) ##### Möller Trumbore Algorithm 一种更快地得出重心坐标的算法 ![](https://lychee.inksoul.top/uploads/original/62/e8/365bd716459ec4e00d507750122f.webp) ### 光线追踪的性能瓶颈 通过简单地计算光线与场景的相交的方式: 1. 需要对场景中每一个三角形判断光线是否相交 2. 找到最接近的交点(即最小的t值) 带来的问题: 1. 算法复杂度 = $pixels \times triangles (\times bounces)$ 2. 计算耗时极高 解决办法: 1. 采取遍历物体而非三角形的方式进行计算 2. 采用相关加速结构/算法 ---------------------------------------