课程往后难度上升,听不懂需多查资料
光线追踪1
光栅化的时候,全局的光照效果不好做,所以引入光线追踪技术。
例如这些全局效果:软阴影、毛玻璃状的镜面反射效果、光线多次弹射的间接光照
光栅化与光线追踪的比较
光栅化:实时的、渲染速度快、质量一般
光线追踪:离线的、渲染速度慢、质量高
基本光线追踪算法
首先,重新假设光线——沿直线传播、光线与光线不会碰撞、光是可逆的
基本光线追踪做法:从眼睛发射射线,打到物体上某一点,判断从光源处发光能否打到物体上该点,能,则说明光源能照到物体上;否,则说明该点在光源的阴影中,最后计算着色结果写回像素颜色中。
whitted-style 光线追踪
对于屏幕中的每一个像素,从世界空间中的观测点发出光线,光线经过模型的每一个交点,都与光源连线(如果被遮挡,就不计算颜色),计算颜色,叠加到像素上。(类似于递归的结构)
从观测点发射光线,需要将光栅化后的像素,转化为齐次裁剪空间->屏幕空间->世界空间
光线与物体表面相交
首先,利用光源的起点 O 和方向向量 d,定义一根光线
r ( t ) = O + t d 0 < = t < = ∞ \mathbf{r}(t)=\mathbf{O}+t\mathbf{d}\quad0<=t<=∞ r(t)=O+td0<=t<=∞
把光线看成一堆点的集合,光线上的点的位置,随时间 t 变化而变化
光线与球的相交
写出 c 为圆心、R 为半径、p 为球上一点的球的表达式: ( p − c ) 2 − R 2 = 0 (p-c)^2-R^2=0 (p−c)2−R2=0
光线与球相交时, p 点同时满足光线的表达式和球的表达式
解二次方程 ( o + t d − c ) 2 − R 2 = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-R^2=0 (o+td−c)2−R2=0 即可
光线与隐式表面相交
隐式表面的表达式,可以写成 f ( p ) = 0 f(\mathbf{p})=0 f(p)=0
然后同上,与光线的表达式联立,求出正的实数根就得到交点了。
光线与三角形网格求交
就是光线与三角形网格的每一个三角形面求交。
首先,判断光线与三角形面相交,可以拆分成两个步骤:
① 光线是否与三角形面所处的平面相交
② 交点是否落在三角形内
设 p’ 是平面内一点,N 是法线,平面的表达式为 ( p − p ′ ) ⋅ N ⃗ = 0 (\mathbf{p}-\mathbf{p'})·\vec{N}=0 (p−p′)⋅N=0
光线与平面相交时,满足方程 ( O + t d − p ′ ) ⋅ N ⃗ = 0 (\mathbf{O}+t\mathbf{d}-\mathbf{p'})·\vec{N}=0 (O+td−p′)⋅N=0
解得 t = ( p ′ − o ) ⋅ N ⃗ d ⋅ N ⃗ t=\frac{(p'-o)·\vec{N}}{d·\vec{N}} t=d⋅N(p′−o)⋅N
然后判断交点是否落在三角形内即可。
另一种算法是 Moller Trumbore 算法,就是直接用光线表达式和三角形重心坐标来计算
加速计算
一个物体有非常多三角形面,如何加速计算光线与每一个三角形面的求交
直接逐像素计算每个三角形面与光线是否相交,运算量太大,有什么办法加速计算?
包围盒
先用包围盒把复杂物体围起来,计算光线追踪时,只有与包围盒相交时,才继续计算包围盒里面的物体,否则跳过——这样就可以做加速计算。
轴对齐包围盒 AABB ,意思是盒子的长宽高三个轴,分别跟 XYZ 坐标轴对应
光线与包围盒相交
光线继续采用某一时刻内的位置向量表示,把包围盒看成是 3 组平面,在每一组平面内可能存在首次进入包围盒的时刻 t m i n t_{min} tmin、离开包围盒的时刻 t m a x t_{max} tmax
确保光线完全进入包围盒、光线首次离开任意包围盒平面,求出 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})\quad t_{exit}=min(t_{max}) tenter=max(tmin)texit=min(tmax) 表示最晚进入盒子、最早离开盒子的时刻
总结发现,当 t e n t e r < t e x i t & & t e x i t > = 0 t_{enter}<t_{exit}\quad\&\&\quad t_{exit}>=0 tenter<texit&&texit>=0 时,光线才与包围盒相交
作业5 光线与三角形面相交
作业内容是如何生成每个像素从观测点发射的光线、利用 Moller Trumbore 算法判断光线与三角形面相交
光线追踪2
AABB 轴对齐包围盒,具体如何加速光线追踪的计算?
均匀网格
直接将包围盒划分成均匀的网格,将物体表面信息存储到网格中。
光线进入包围盒中,会经过一系列网格。
其中,当光线经过内部存有物体表面信息的网格时,需要进行下一步计算,判断光线是否与网格内的物体表面相交;光线经过内部没有物体表面信息的网格时,则不需要进行计算。
这里将包围盒划分为多少个均匀网格比较合适?太多太少都不合适。一般取 27 乘上包围盒中物体个数。
均匀网格,适用于场景中物体分布比较均匀的情况。
空间划分
按照包围盒内物体在空间中分布情况,细化网格,有三种常见划分方式:八叉树、KD树、BSP树
八叉树:包围盒按行列中央,均匀划分四块区域,不断细分,按指数级增长
KD树:包围盒按行列,不均匀划分区域,区域内有多个物体时才划分,是八叉树的改进版。使用最多。
只在叶子节点存储物体表面
BSP树:包围盒沿斜线划分,计算复杂
上面三种划分空间的方法,都存在局限性,例如一个物体存入多个网格中,浪费资源。
因此提出按照物体来划分的方法。
BVH 划分
构建一种包围体积的层次结构,每个物体就只存储一次
具体如何生成这样的包围体积结构?递归地划分,知道包围体积中物体数量较少。
法一:每次沿着最长的轴划分
法二:每次找到排在中间的物体进行划分
作业6 光线与包围体积的相交、BVH查找
辐射度量学
前面在光照模型时,没有细究光线传播的能量。
现在要想做到更真实的光线效果,就需要对光线定义一系列物理量。
Radiant flux :辐射通量,光线在单位时间的辐射能量
Radiant Intensity :辐射强度,光线在单位立体角对应的辐射通量
立体角:物体在特定点的三维空间角度
对于均匀发光的点光源,可以写出它的 Radiant Intensity