175 lines
3.9 KiB
Markdown
175 lines
3.9 KiB
Markdown
---
|
||
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. 通过向光源发送光线的方式来生成阴影
|
||
|
||

|
||
|
||
#### 生成视角射线(Generating Eye Rays)
|
||
|
||
Pinhole Camera Model
|
||
|
||

|
||
|
||
#### 着色像素(shading pixel)
|
||
|
||

|
||
|
||
|
||
### 递归式光线追踪(Recursive Ray Tracing)
|
||
|
||
Recursiv Ray Tracing 又名 Whitted-Style Ray Tracing 由T.Whitted在1980年提出
|
||
|
||
"An improved Illumination model for shaded display"
|
||
|
||

|
||
|
||
总体计算流程
|
||
|
||

|
||
|
||
-------------------------------------------
|
||
|
||
#### 射线表面相交计算(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}$
|
||
|
||

|
||
|
||
|
||
##### Möller Trumbore Algorithm
|
||
|
||
一种更快地得出重心坐标的算法
|
||
|
||

|
||
|
||
|
||
### 光线追踪的性能瓶颈
|
||
|
||
通过简单地计算光线与场景的相交的方式:
|
||
1. 需要对场景中每一个三角形判断光线是否相交
|
||
2. 找到最接近的交点(即最小的t值)
|
||
|
||
带来的问题:
|
||
1. 算法复杂度 = $pixels \times triangles (\times bounces)$
|
||
2. 计算耗时极高
|
||
|
||
解决办法:
|
||
1. 采取遍历物体而非三角形的方式进行计算
|
||
2. 采用相关加速结构/算法
|
||
|
||
|
||
|
||
---------------------------------------
|
||
|
||
|