GAMES101-Ray Tracing

光栅化无法很好的控制全局效果,fast but quality is low

glossy reflection:对比铜镜

Indirect illumination:间接照明


Introduction

三个ideas

  • 光线沿直线传播
  • 光线之间不会发生碰撞
  • 光线来自light source

光线可逆


eye ray

眼到每一个pixel的射线


Whitted-Style

反射、折射

每一个弹射点的着色都会被算入 eye ray 的 pixel,每一个点都要判断是否能被照亮

primary ray,secondary ray,shadow ray


光线:

由源点和方向向量定义

任意一点:r(t) = O + td

和球的交点:点p同时满足光线方程和球方程

其他隐式表面同理


显式表面:和三角形求交

先求光线和平面交点,再判断是否在三角形内

平面:法线+点

MT算法:利用三角形重心坐标,直接求t


加速

利用 bounding Volumes 包围盒

减少大量的光线和三角形交点计算

轴对齐包围盒(AABB,Axis-Aligned Bounding Box)

可求每对平面间光线的出入时间 t,求交集,非空则光线进入,进入的时间<射出的时间

  • 离开时间<0:无交点
  • 离开>0,进入<0,光源在盒子里,有交点

加速结构

尽量做格子和光线的交

大规模空白集中物体场景就不适合均匀格子


空间划分

物体密集处多分,稀疏处少分

Oct-Tree:8叉树,其中大部分是空白就可判断停止划分

KD-Tree:对Oct的优化,每次沿着某条轴砍一刀,水平竖直交替划分

BSP-Tree:

构造树形结构来存储物体(叶节点),中间节点存储其他信息


物体和包围盒

判断物体是否在包围盒内很复杂,导致KD-Tree使用率变少


基于物体的划分 (Bounding Volume Hierarchy)BVH

目前常用,解决了空间划分的问题

将物体分块,重新计算包围盒

  • 一个物体只在一个bounding box中
  • 但是box会相交,尽可能让box间的重叠变少

辐射度量

Blinn-Phone模型等都是做了极大的简化,渲染出的图依旧能很容易的判断真假

基于物理赋予光更具体的参数能带来更真实的渲染


Radiant Energy:Q[J]

Flux(power):功率,单位时间内通过某面的光子量,dQ/dt [W=Watt] [lm=lumen]


intensity

每单位立体角的power,发射

[W/sr]

立体角可以理解为角度、弧度的3维扩展

立体角对应的球表面积/半径平方

dA = (rdθ)(rsinθdφ) = r^2*sinθ*dθ*dφ

微分立体角dω=dA/r^2=sinθdθdφ

任意方向上辐射出的I


Irradiance

单位面积接受到的power,接受

E(x)=dΦ(x)/dA

E=Φ/4πr2


Radiance

单位立体角单位投影面积的power

描述从某个面向某个方向辐射的能量

可以理解为每单位立体角的Irradiance或每单位面积的intensity


radiance对所有方向求积分就是Irradiance

双向反射分布函数BRDF

描述表面Irradiance的反射分配,定义了不同的材质

渲染方程

物体的自发光+BRDF

L=E+KL

L=E+KE+K2E+K3E+……

蒙特卡洛积分

一种求解定积分的方法,在原函数复杂不可求的情况下得出其结果

在积分区间内不断采样,用长方形的面积表示积分,最后对所有长方形的的面积求平均

$$
满足概率X_i-p(x)
\
\int f(x)dx=\frac{1}{N}\sum^{N}_{i=0}\frac{f(X_i)}{p(X_i)}
$$

路径追踪

whitted-Style无法解决:多次反射和color bleeding


直接光照:对渲染方程进行蒙特卡洛积分

间接光照:把物体当光源,回到直接光照


光线弹射存在指数爆炸

  • 每个着色点打出一条光线,路径追踪

俄罗斯轮盘赌(Russian Roulette,RR)

路径递归问题,结束条件

以一定的概率p,shoot a ray and return the shading result divided by p:Lo/p

再用1-p的概率不打光线,get 0

期望:E=p*(Lo/p)+(1-p)*0=Lo

每次以一定概率打光线,能不能打光看运气


均匀采样会有光线浪费问题

直接在光源上采样,完全不浪费

采样变两部分:光源直接照射和反射(用RR)