课程来源:GAMES101-现代计算机图形学入门-闫令琪 Lecture13
GAMES101 现代计算机图形学入门
主讲老师:闫令琪,UCSB
课程主页:https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
为什么要使用光线追踪?
- 光栅化做阴影很困难,特别是当光线多次反射、或时软阴影时。
- 间接光照:光打到一个物体上,又反射到另一个物体上……最后反射到摄像机。
-
光栅化虽然快,但是质量很差,是一种很近似的渲染方法。
-
光线追踪虽然准确,但是非常慢。
-
光栅化一般时实时的,光线追踪一般是离线的。
-
一帧需要花10k CPU小时处理(非常非常慢)
-
速度和质量,往往只能选一个。
基础光线追踪算法
- 关于光线的三个想法(假设)
- 光以直线传播(尽管这是错误的)
- 如果光线交叉,它们就不会相互“碰撞”(尽管这仍然是错误的)
- 光线从光源传播到眼睛(但在路径反转-互易作用下,物理学是不变的)。
当你凝视着深渊的时候,深渊也凝视着你。
射线检测
- Generate an image by casting one ray per pixel 通过每像素投射一条射线来生成一个图像
- Check for shadows by sending a ray to the light 通过向光线发送光线来检查阴影
产生“眼睛射线”
- 原理:沿着一个光线,记录它最近的交点。
- 考虑这个点会不会被照亮:从这个点向光源连线。
Whitted-Style Ray Tracing – Whitted风格光线追踪
- Whitted-Style光线追踪是一个递归的算法。
- 1979年,渲染这张图需要74分钟。2006年,只需要6秒。2012年,只需要1/30秒。
算法图解
- 首先考虑反射光线
- 折射光线
- 对每个交点,做连线,看这个点能否被照亮。
- 算上能量损失
Ray-Surface Intersection 射线表面交点
光线是由它的原点和一个方向向量来定义的。
射线方程:
r
(
t
)
=
o
+
t
d
0
≤
t
<
∞
\mathbf{r}(t)=\mathbf{o}+t \mathbf{d} \quad 0 \leq t<\infty
r(t)=o+td0≤t<∞
光和球求交点
Ray:
r
(
t
)
=
o
+
t
d
0
≤
t
<
∞
\mathbf{r}(t)=\mathbf{o}+t \mathbf{d} \quad 0 \leq t<\infty
r(t)=o+td0≤t<∞
Sphere:
p
:
(
p
−
c
)
2
−
R
2
=
0
\mathbf{p}:(\mathbf{p}-\mathbf{c})^2-\mathbf{R}^2=0
p:(p−c)2−R2=0
求交点就是求这连个方程的共同解
Solve for intersection:
(
o
+
t
d
−
c
)
2
−
R
2
=
0
(\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-\mathbf{R}^2=0
(o+td−c)2−R2=0
简单的几何求一下:为了让他在物理上有意义,我们求得的解必须是一个实数,而不是一个虚数。虚数是没有物理意义的。
光线和一般性的隐式表面求交点
这个交点一定又在光线上,也一定在隐式表面上,然后求方程解即可。
光对于显式表面的交点
- 转化为光和三角形求交点
- 三角形一定在一个平面内
- 判断光线和平面是否相交
- 判断交点是否在三角形内(这个之前讲过如何判断)
- 定义一个平面:平面由法向量和平面上的一个点来定义。
- 平面方程(如果p满足它,那么p就在这个平面上)
解方程……
虽然比较麻烦,但这个式子是非常直观的式子。
光线追踪-性能挑战
- 简单射线场景交叉点
- 光线与每个三角形的射线交点
- 找到最接近的命中值(即最小值t)
- 问题:非常缓慢——
- Naive algorithm = #pixels ⨉ # traingles (⨉ #bounces)
- 朴素算法=#像素×#三角形(×#反弹)
- For generality, we use the term objects instead of triangles later (but doesn’t necessarily mean entire objects)
- 为了通用性,我们在后面使用术语对象而不是三角形(但并不一定意味着整个对象)
Bounding Volumes 包围盒/包围体积
通过包围盒的方式进行加速。
用一个相对简单的形状将物体包起来,如果一个光线连包围盒都碰不到,那么这个光线不可能碰到包围盒内的物体。
这是一个很简单,但很有效的加速方法。
我们一般使用一个轴对齐包围盒—— Axis-Aligned Bounding Box(AABB)
-
a box (3D) = three pairs of infinitely large slabs
一个盒子(3D)= 三对无限大的板 -
Key ideas 核心思想
- The ray enters the box only when it enters all pairs of slabs
只有当光线进入所有的板对时,光线才会进入盒子 - The ray exits the box as long as it exits any pair of slabs
只要光线离开任何一对石板,光线就会离开盒子
- The ray enters the box only when it enters all pairs of slabs
-
For each pair, calculate the t m i n t_{min} tmin and t m a x t_{max} tmax (negative is fine)
对于每一对,计算 t m i n t_{min} tmin和 t m a x t_{max} tmax(负数是可以的)。 -
对于3D盒子, t e n t e r = m a x { t m i n } , t e x i t = m i n { t m a x } t_{enter} = max\{t_{min}\}, t_{exit} = min\{t_{max}\} tenter=max{tmin},texit=min{tmax}
-
If tenter < texit, we know the ray stays a while in the box.(so they must intersect!)
如果 t e n t e r t_{enter} tenter< t e x i t t_{exit} texit,我们知道光线在盒子里停留一段时间(所以它们必须相交!) -
However, ray is not a line
然而,光线并不是一条线- Should check whether t is negative for physical correctness!
应该检查t是否是负的物理正确性!
- Should check whether t is negative for physical correctness!
-
What if t e x i t < 0 t_{exit} < 0 texit<0?
- The box is “behind” the ray — no intersection!
这个盒子就在光线的“后面”,没有交点!
- The box is “behind” the ray — no intersection!
-
What if t e x i t > = 0 t_{exit} >=0 texit>=0 and t e n t e r < 0 t_{enter} < 0 tenter<0?
- The ray’s origin is inside the box — have intersection!
光线的原点在盒子里,有交叉点!
- The ray’s origin is inside the box — have intersection!
-
In summary, ray and AABB intersect iff
总结,射线和AABB包围盒会相交,如果…… -
t e n t e r < t e x i t t_{enter} <t_{exit} tenter<texit && t e x i t > = 0 t_{exit} >= 0 texit>=0