GAMES101-Ray Tracing
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)