Games101-13-16 RayTracing
Lecture 13 Ray Tracing
a). vs. Rasterization
光栅化难以表现全局(global)效果,如
- (软)阴影(Soft shadows)
- 光线反弹超过一次(Glossy reflection)
- Indirect illumination(间接光照)
Rasterization is fast, but quality is relatively low;
b.). Basic Ray-Tracing Algorithm
光追中光线的性质:
- 光是沿直线传播的;
- 光相交时,并不产生干扰;
- 光从光源出发,传播到眼睛(由于光路可逆,也可是光线从眼睛出发,传播到光源)
b.1). Ray Casting
做法:
- Generate an image by casting one ray per pixel;(生成从眼睛出发的光线)
- Check for shadows by sending a ray to the light;(检查光线投射点是否可传播到光源)
- 光线由眼睛出发,可不再使用深度缓存;
- 投射点到光源发射Shadow Ray,查看该点是否在阴影里(是否对光源可见);
c). Whitted-Style Ray Tracing(Recursive, 递归)
- 过程:
- 生成眼睛到像素a的光线(Primary ray),打到第一个与光线相交的点;
- 形成反射(镜面反射)和折射的光线(Secondary rays,之后的都是Secondary rays);
- 对每条光线与object的交点做到光源的光线(Shadow rays);
- 将所有Shadow rays未被阻挡的光线的着色结果相加,即为像素a的着色结果;
c.1). Ray-Surface Intersection(求交点)
c.1.1). 与球形相交:
- 推广:与隐式表面相交
c.1.2). 与三角形求交:
几何上:判断内外;
- 空间内任意一点为起点做一光线,若该光线与object(封闭)交点数为奇数,则该点在object内;若交点数为奇数,则该点在object外;(缠绕数的奇-偶原则)
计算过程:
即 $r(t)=o+td,0\leq t < \infty$ 和 $(p-p’)·N=0$ 联立求 $t$;
之后求得点P是否在三角形内;
Möller Trumbore Algorithm
- 按传统求解,求出 $t$ 后,还需要判断 P 点是否在三角形内,较为繁琐,因此提出Möller Trumbore Algorithm
- 射线$r(t)=O+tD$ ,与由重心坐标表示的三角形上的点 $P$ 求解(三个式子,三个未知量,根据克拉默必定有解);
- 求得交点后,可通过重心坐标得知该点是否在三角形外;
c.2). Acclerating Ray-Surface Intersection
- 原因:当需要求得光线最近的交点时,需要遍历场景所有三角面,速度慢,需要加速;
c.2.1). Axis-Aligned Bounding Box(AABB,轴对齐包围盒)
Bounding Volumes
- 思想:当物体不与包围体积相交时,更不可能和物体相交;
Bounding Box(AABB for example):
- 理解:盒子是3对对立的面的交集;
- Axis-Aligned Bounding Box(AABB)
- AABB包围盒的面总在xy/xz/yz平面;
光线与AABB求交:
- 2D情况下(3D同理)
- 思想:
- 光线进入Box:只有当光线进入所有的对立面;
- 光线出Box:只要光线出射一个对立面;
- 对于3D的Box,$t_{enter}=max\{t_{min}\},t_{exit}=min\{t_{max}\}$;
- 如果 $t_{enter}<t_{exit}$,则光线经过Box;
- 对于 $t_{enter}$ 和 $t_{exit}$ 正负情况的考虑:
- $t_{exit}<0$:不相交(Box在光线后边)
- $t_{exit}<0$ and $t_{enter}<0$:光线起点在盒子里,一定相交
- 当且仅当 $t_{enter}<t_{exit}\quad\&\&\quad t_{exit}\geq0$,光线与AABB相交;
- 为什么使用AABB:求交方便;
Lecture 14&15 Ray Tracing(Acceleration & Radiometry; Light Transport & Global Illumination)
a). Uniform Spatial Partitions(统一空间分区)
Heuristic:
- #cells = C * #objs
- C ≈ 27 in 3D
缺陷:
- 格子大小相同,浪费空间;
- 对于空间分布不均匀的场景容易造成“Teapot in a stadium” problem,浪费性能;
b). Spatial Partition
- 常见的空间划分的类型:
- Oct-Tree(3维中是八叉树,2维中是四叉树;$2^n$叉树,n=维度)
- 受维度影响;
- KD-Tree;
- 每次只划分一次,如果是三维则按x,y,z方向循环划分;
- BSP-Tree
- Oct-Tree(3维中是八叉树,2维中是四叉树;$2^n$叉树,n=维度)
b.1). KD-Tree
- 预处理:对空间进行划分,对于子空间每次只划分一次(1、2、3划分省略);
- 树节点(Internal node)的数据结构:
- 划分轴:x-, y- , or z-axis;
- 划分位置:分割平面沿轴的坐标;(?)
- 子节点;
- 不存储object;
- 叶子节点数据结构:
- object的列表
- 树节点(Internal node)的数据结构:
- 过程:
- 光线和叶子节点1(为方便把$1$暂看作叶子节点,尽管个节点应该继续划分,$2,3$同理)相交,判断光线和$1$中储存的object是否相交(无相加,继续);
- ……
- 光线和叶子节点3相交,判断光线和$1$中储存的object是否相交,相交,记录$t_{hit}$;
- 缺点:
- 预处理的过程中,物体(三角形)和网格求交难;
- 如三角形和Box求交,有可能是一个小Box穿过三角形(被三角形“包裹”)
- 同一个Object可能储存在多个叶子节点中;
- 预处理的过程中,物体(三角形)和网格求交难;
c). Bounding Volume Hierarchy (BVH)
- 特征:先将object分为两组,再重新计算包围盒,使得同一个obejct只会在一个叶子节点中出现;(但会造成Bounding Box空间的冗余)
- 过程:
- 找到包围盒;
- 递归地将物体的集分为两个子集;
- 重新计算子集的包围盒;
- 满足条件时停止;
- 储存objects到对应的叶子节点;
- 划分子节点:
- 选择一个维度去划分;
- Heuristic #1: 选择最长的轴去划分;
- Heuristic #2: 选择中间的object的位置去划分;(快速选择算法)
- BVHs的数据结构:
- 非叶子节点:
- Bounding box
- Children: pointer to child nodes
- 叶子节点:
- Bounding box
- List of objects
- Nodes represent subset of primitives in scene
- 非叶子节点:
BVH Traversal:
空间划分和物体划分:
d). Radiometry
d.1). Radiant Energy and Flux(Power)
- Radiant Energy(辐射能量):
- Definition: Radiant energy is the energy of electromagnetic radiation. It is measured in units of joules, and denoted by the symbol:
Flux(辐射通量):
- Definition: Radiant flux (power) is the energy emitted, reflected, transmitted or received, per unit time.
- Important Light Measurements of Interest
d.2). Radiant Intensity(辐射强度)
- 定义:单位立体角上,产生的、反射的、接收的辐射通量。符号:I;单位:瓦特/sr、lm/sr、candela、cd。 立体角(solid angle)是有方向的,所以辐射强度是一个方向有关的属性
d.2.1). Solid angle
- 角度(2D): 弧长除以半径;
- $\theta={l\over r}$
- 立体角:立体角面积除以半径的平方
- $\Omega=\frac{A}{r^{2}}$
- 球体的立体角为$4\pi$
d.2.2). 计算过程
立体角微分:
二重积分计算,总的立体角 = 球面上无数个单位立体角的加和,即∫∫sinθdθdφ
积分限也比较好理解:θ:0 → π,一个半圆弧, φ:0 → 2π,用半圆转一整圈得到球面
通常把ω当做方向向量来理解,这样比较好描述intensity
如果点光源向三维空间中均匀的辐射出能量,怎么描述强度?
I = Φ / 4π
Φ:点光源单位时间内,向三维空间中辐射出的能量
4π:整个三维空间的总立体角
其比值就是单位立体角上的辐射通量
d.2.3). Irradiance(辐照度)
定义:每单位面积(与光线垂直,Lambert’s Cosine Law)的能量
Lambert’s Cosine Law
- e.g. 太阳高度角造成四季变化
- 随半径变大,Irradiacne变小,而radiant intensity不变;
d.2.4). Radiance(辐亮度)
介绍:
- Radiance是和光线有关的量;
- 渲染就是在计算radiance;
单位:The radiance(luminance) is the power emitted. reflected, transmitted or receivedd by a surface, per unit solid angle, per projected unit area.
理解:
Radiance定义:power per unit solid angle, per projected unit area.
Irradiance: power per projected unit area
Intensity: power per solid angle
So:
Radiance: Irradiance per solid angle
- Incident Radiance
Radiance: Intensity per projected unit area
- Exiting Radiance
Incident Radiance: The irradiance per unit solid angle arriving at the surface
- 即 $\omega$ 方向的光线对于 $dA$ 的贡献;
- Exiting Radiance: The intensity per unit projected area leaving the surface
- 即面积光 $dA$ ,对 $\omega$ 出射方向的贡献;
- Irradiance vs. Radiance
- Irradiance和Radiance的区别在于方向性;
- 图中,$dA$ 的辐照度 $E(p)$ 为各方向(半圆)对 $dA$ 的贡献。$dA$ 的Radiance $L_i(p,w)$ 为入射方向 $d\omega$ 对 $dA$ 的贡献;
- 即,Irradiance $E(p)$ 是 radiance $L_i(p,w)$ 对于各个立体角的积分,$L_i(p,\omega)$ 是 $E(p)$ 方向 $\omega$ 的积分;
c). BRDF(Bidirectional Reflectance Distribution Function)
Ver Games101
- 过程:光线照射到一点($p$),该点吸收能量,再辐射出去;
- 定义:
- 分母:${\omega}_i$ 方向入射的radiance $L_i(x,{\omega}_i)$,被一点吸收后,辐射往各个方向的Irradiance $E_i({\omega}_i)$;
- 分子:$E_i({\omega}_i)$,对 ${\omega}_r$ 方向radiance的贡献 $L_r(x,{\omega}_r)$
Ver self:
- 定义:BRDF(双向反射分布函数, bidirectional reflective distribution function), 是指当一束光从某个方向( $\vec l$ )照射到某个点($p$)上时,在某个方向上( $\vec v$ )的
出射辐射通量
占总的入射辐射通量
的比例
可以理解对于某一微小(对立体角)出射光线ωi,某一微小入射光线ωj对其radiance的贡献;
也可以理解成某一微小入射光线ωj,弹射到某一方向的微小立体角ωi的光线强度的比值;
由于为了方便测量,不定义为radiance相除(即如果按照我们一开始对入射方向 微分的方式定义brdf,那么科学家们只需要使用一个极小的光源从 方向入射到点p,就可以测得brdf的值。但是如果定义为radiance相除,就很难输入一个填充立体角刚好等于1的光源。)正常单位为:
d). Rendering equation
d.1). 简介
- The Reflection Equation
- $f_r(p,w_i,w_r)$ 为该点的BRDF
- 问题:
- incoming radiance 不止来源于光源,也来源于其他反射(递归);
- 未考虑自发光情况(加入自发光项,变为渲染方程)
- 问题:
- The Rendering Equation
- 加入了自发光项 $L_e(p,{\omega}_o)$
- 考虑多次反射
- 注意:该方程假定所有方向都是朝外的;
- $H^2$ 和 $\Omega$ 表示半球的积分域;
d.2). 理解
- Reflection Equation:
- 反射的Radiance是各个方向光源对出射方向Radiance贡献的积分;
- 未考虑光线多次弹射
- Rendering Equation:
- 考虑多次弹射,即其他物体反射的光线也会对出射方向 ${\omega}_r$ 的Radiance做出贡献;
- 对于渲染方程,只有 $L_r(x,{\omega}_r)$ 和 $L_r(x’,-{\omega}_i)$ 是未知的;
- 简化渲染方程:
- Rendering Equation as Integral Equation
- Linear Operator Equation
- $E$ 环境中自发光对应向量,$L$ Radiance对应的向量;
- $K$ 反射算子(矩阵)
- 对于Rendering Equation的线性形式,我们可以用以下式子逼近(类似泰勒展开):
Rendering Equation的线性形式对于光追的启示:
- $E$ 为自发光,$KE$ 为 直接光照(即弹射一次),$K^2E$ 为间接光照(弹射两次)
- 全局光照(Global illumination, GI):直接光照+间接光照
- 基础的光栅化只做了自发光和直接光照,即 $E$ 和 $KE$
对比
- 上方玻璃灯:两次弹射时,光线从摄影机出发不能从玻璃罩中射出,因此其为黑色。而四次弹射时,光线从摄影机出发可以从玻璃罩中射出;
- 当bounce数目增大时,亮度会趋于一个值,而不会无限增大;
e). Probability
Lecture 16 Ray Tracing 4 (Monte Carlo Path Tracing)
a). Monte Carlo Integration
使用原因:一些函数过于复杂,因此对于特定积分域,不求不定积分,只求其积分的结果。(一种数值方法)
过程:对函数的随机样本进行平均来估计函数的数值;
-
- 除以 $p(x_i)$ 是一种加权,因为对于积分域上样本的采样可能是不均匀随机采样
均匀采样的情况:
Some notes:
- 采样越多,方差越小
- 如在$x$上积分,要采样$x$
-
b). Paht Tracing
b.1). vs Whitted-Style Ray Tracing
Whitted-Style Ray Tracing
遇到光滑物体会只会 反射/折射(择一进行)
无法表现Glossy reflection
遇到漫反射物体停止弹射
- 没有Color Blooding(eg.direct illumination),考虑不到漫反射物体之间的光线传播
But the rendering equation is correct
- 需要做的:
- 解决半球域的定积分
- 蒙特卡洛积分
- 递归
- 解决半球域的定积分
- 需要做的:
b.2). A Simple Monte Carlo Solution(Direct illumination)
渲染一个Pixel(Point),当前 之考虑直接光照
当 $\omega_i$ 与light相交时,计算该方向的radiance;与Box相交时,则该方向的radiance=0;
P-Code
b.3). Global illumination(加入递归)
b.3.1). GI and problems
P-Code
Problem1: Explosion of #rays as #bounces go up
解决方法: N=1(N=1即Path Tracing,Distributed Ray Tracing if N != 1)
N=1会造成较多的Noise,因此采用Subpixel,即每个像素内多次采样(Samples per pixel, SPP)
Problem2: 递归不会停止
现实世界中,光线的弹射次数是无限的
简单地,减少弹射次数 == 减少能量;
解决方法: Russian Roulette(RR, 俄罗斯轮盘赌)
b.3.2). Russian Roulette(RR, 俄罗斯轮盘赌)
先前一点的着色结果是 $L_o$,引入RR后
- With probability $P$, shoot a ray and return the shading result divided by P: Lo / P
- With probability $1-P$, don’t shoot a ray and you’ll get 0
由此可得出数学期望 $E=P \cdot\left(\frac{L_{o}}{p}\right)+(1-P) \cdot 0=L_{o}$
b.3.3). 优化
计算直接光照时,如对点P向各个方向均匀采样,当光源小时,直接光照的贡献会小,造成较多的噪声;
解决方法: 换元,使渲染方程对光源面积 $A$ 进行积分,pdf = 1/A
- 立体角可以看前面辐射度量学的部分
过程:(直接光照,间接光照分开计算)
- light source (direct, no need to have RR)
- other reflectors (indirect, ues RR)
P-Code(未考虑遮挡)
遮挡
附上上学期做的光追(借鉴smallpt):
1 | /** |