光线追踪

光栅化为什么不能很好的表示全局效果

  1. 软阴影
  2. glossy反射
  3. 间接光照
  4. 光栅化是一种很快,但相对低质量的
  5. 光线追踪是一种准确的,但非常慢
  6. 光栅化更多用于实时渲染,光线追踪更多用于离线渲染
  7. 光线追踪一帧大概需要10k cpu hour

基础的光线追踪算法

  1. 光线是沿着直线传播
  2. 光线与光线不会碰撞
  3. 光线从光源经过一系列路径到达眼睛,光线传播具有可逆性

光线追踪

  1. 连接摄像机的点与屏幕上每一个像素点,形成一条光线
  2. 一旦这条光线与某个物体发生相交,连接该点与光源,如果该点不在阴影里,则光路就确定了
  3. 最后计算该点的光能量,着色

whitted风格光线追踪

  1. 光线在任意一个点可以继续传播,反射或者折射
  2. 所有点的着色加在一起,反映在屏幕的某一点
  3. 主光线(primary ray): 由摄像机位置直接发出的光线
  4. 副光线(secondary ray): 经过反射或者折射形成的新的光线
  5. 阴影光线(shadow ray): 从目标点到达光源的光线

求光线与物体表面的交点

  1. 光线是由起点和方向定义的: r(t) = o + td,d代表方向,o代表起点,0=<t<无穷大
  2. 光线与球体交点: 球的定义,p: (p-c)^2 - R^2 = 0,交点既在光线上,也在球上
    1. (o+td-c)^2-R^2=0
    2. at^2+bt+c=0,a = d * d, b = 2(o-c)*d,c = (o-c)*(o-c) - R^2
    3. 用二次函数通用解公式求t,有实数解的前提: b^2 - 4ac > 0,且t >= 0
  3. 光线和一般隐式表面求交点: 隐式表面p: f(p) = 0,则f(o+td) = 0,满足实数解,且t>=0
  4. 光线与显示表面求交点:
    1. 可见性,阴影,光照
    2. 判断一个点是否在封闭的物体内,从该点任意射出一条光线,与物体有奇数个交点,则在物体内,偶数个交点,则在物体外
    3. 最简单的方法: 一个一个三角形判断是否与光线有交点,但是很慢
    4. 只考虑光线与三角形有0或者1个交点
    5. 三角形是一个平面
    6. 求光线与平面求交点
    7. 判断点在三角形内
    8. 平面: 定义一个点p'和一个法线N,平面一定过该点,则平面上的点p: (p-p') * N = 0,展开后: ax + by + cz +d = 0
      1. (o+td-p')*N = 0
      2. t=((p'-o)*N)/d*N, t>=0
      3. MT算法,用重心坐标求解t,o+td=(1-b1-b1)*p0+b1*p1+b2*p2,用克拉默法则求解线性方程组,且满足t>0, b1>0, b2>0, 1-b1-b2>0

加速光线和表面求交点

  1. 简单判断存在的问题,复杂度为 pixels * objects * bounces,非常慢
  2. 包围盒:
    1. 用一种简单的图形包围物体,比如长方体,球体
    2. 如果光线连包围盒都碰不到,一定也碰不到里面的物体
    3. 对于三维的物体而言,常用的包围盒是长方体
    4. 长方体是三个对面形成的交集
    5. 通常用到的包围盒叫轴对齐包围盒AABB(Alis-Aligned Bounding Box),长方体的每一条边,都是对应的x, y或者z轴平行的
  3. 判断光线与包围盒相交
    1. 将3d情况简化为2d,光线与长方形相交
    2. 假设光线在tmin0, tmax0与长方形的一对边相交,tmin1,tmax1与长方形的另一对边相交,则求线段(tmin0, tmax0)与(tmin1, tmax1)求交集
    3. 考虑3d情况,有3个对面,如何判断光线进入了盒子: 光线要进入盒子,一定是进入了三个对面空间中,光线只要离开任意一个对面,则离开盒子
    4. 每一组对面,计算一次光线进入对面的tmin和tmax
    5. tenter = max(tmin), texit = min(tmax)
    6. 如果tenter < texit,说明光线在盒子内停留过,才有交点
    7. 光线不是一条直线,要检查t不为负
      1. 如果texit < 0,则盒子在光线背后,不可能有交点
      2. 如果texit >=0 且 tenter < 0,则点在盒子内,肯定有交点
      3. 总结,光线与AABB有交点,当且仅当tenter < texit && texit >= 0
    8. 为什么选择轴对齐的包围盒?
      1. 原来的点与面相交的求解是3个分量,6个乘法,1个除法
      2. 选用轴对齐的包围盒之后,如果某一个面与x轴垂直,则可以用x轴的分量来计算t,t = (p'x - ox) / dx,,简化为1个分量,1个除法

AABB怎么能帮助加速求交点

  1. 找到包围盒
  2. 创建grid
  3. 将物体存储于格子中,即判断格子是否与物体表面相交
  4. 假设光线与格子求交比与物体求交要快
  5. 光线经过的格子如果有物体,则求光线与该物体是否有交点
  6. 加速效果:
    1. 如果只有一个格子,则无效果
    2. 如果格子太密集,效率会下降
    3. 如果场景中的物体分布均匀,则加速效果会比较好,反之,如果物体分布不均匀,则加速效果会很差

空间划分

  1. oct-tree(八叉树,无相之*): 空间立方体,切3刀,形成八个均等的立方体,然后判断每个立方体中是否有物体,以及物体的个数,决定是否继续切下去,这种方法有个问题,在视觉上看是4叉树,容易搞混
  2. kd-tree(拼多多): 每次只切一刀,而且一直是沿着2个轴切,每次轮换
  3. bsp-tree: 每次切是按一个斜线,计算复杂度较高

kd-tree

  1. 数据结构:
    1. 每个中间节点都必须
      1. 存储split axis: 沿着哪个轴划分x, y, z
      2. 存储split position: 划分的位置,划分平面的坐标
      3. 存储children: 指向子节点
      4. 不存储任何物体
    2. 每个叶子节点都必须
      1. 存储物体
  2. 存在一个问题,很难判断一个格子与哪些三角形有交集
  3. 另外一个问题,一个三角形可能与多个格子有交集,则一个物体可能出现在多个格子的叶子结点

BVH - Bounding Volume Heirarchy

  1. 本质: 把物体分为两堆,分别重新求包围盒
  2. 流程:
    1. 找到一个包围盒
    2. 递归的把物体拆分成2个部分,并且重新计算包围盒
    3. 当叶子结点有足够少的物体,则停止递归
  3. 如何去划分一个节点?
    1. 选择一根轴去划分
    2. 总是选择最长的轴去划分
    3. 取中间的物体进行划分,平衡二叉树,或者快速找出中位数,topk算法,快速选择算法
  4. 何时停止划分: 当物体个数小于等于5的时候,停止划分
  5. 数据结构:
    1. 中间节点存储
      1. bounding box: 包围盒
      2. children: 子节点
    2. 叶子结点
      1. bounding box: 包围盒
      2. list of objects: 物体

Radiometry - Motivation 辐射度量学的动机

  1. 布林冯模型中的光照强度从1到10,这个10是什么?
  2. whitted风格的光线追踪是正确的吗?
  3. 辐射度量学是给我们精确的光的物理量

辐射度量学

  1. 光照单位的测量系统
  2. 光在空间中的属性,新的概念: radiant flux, intensity, irradiance, radiance
  3. 物理上一个准确定义光照的方法
  4. 辐射能量 radiant energy: 电磁辐射的能量,Q,单位J(Joule)
  5. radiant flux(power): 单位时间的能量,类似功率 = dQ/dt,单位W(Watt)(lm = lumen)
  6. flux: 单位时间内接收光子的量
  7. radiant intensity: 一个光源向外辐射的方向性的能量
  8. irradiance: 物体表面接收到的光的能量
  9. radiance: 光在传播过程中具有的能量

Radiant Intensity

  1. power per unit solid angle,每一个单位立体角的power
  2. I(w) = do / dw,dw代表角度,do代表power,最终单位[W/sr][lm/sr = cd = candela]
  3. angle: 弧度制的角度,o = l / r,弧长除以半径,整个圆为2PI
  4. solid angle: 三维空间,dw = dA / r^2,弧面除以半径平方,整个球为4PI
  5. 计算方式: dA = (r*da)*(r*sina*db),a为立体角与z轴的夹角,b为立体角绕z轴旋转的角度,单位立体角dw = dA / r^2 = da * sina * db
  6. 点光源: I = power / 4PI
  7. 有一个灯泡815(lm),则intensity = 815(lm) / 4PI(sr) = 65(candelas)

irradiance

  1. power per unit area,面与光线垂直
  2. E(x) = dx / dA,单位:[W/m^2][lm/m^2 = lux]
  3. 如果面不垂直,E = (dx / dA) * cosa
  4. irradiance falloff: E = Ea / 4PI, E' = Ea / (4PI * r^2), Ea表示点光源的power,E表示r为1的情况,只有irradiance在衰减,intensity不衰减

radiance

  1. power per unit solid angle, per projected unit area
  2. irradiance per solid angle
  3. intensity per projected unit area
  4. 分两部分,incident radiance 和 exit radiance
  5. incident radiance: irradiance per unit solid angle arriving at the surface,从光入射到平面上考虑,平面接收到的power就是irradiance,这个平面可以接收到来自各个角度的光线,现在只考虑一个单位立体角的power,则相当于从该平面接收到一个单位立体角的能量值
  6. exit radiance: intensity per unit projected are leaving the surface,当光从平面辐射出去的情况下,往某一个方向辐射出的power为intensity,现在只考虑平面单位面积的power,则相当于该平面单位面积往一个单位立体角辐射出的能量值

irradiance vs radiance

  1. irradiance为面积dA收到的power,radiance为面积dA从单位立体角收到的power,做一次积分,则p点收到的总的power为来自各个单位立体角的power之和,dE(p, w) = Li(p, w) * cosa * dw,dE为irradiance,Li为radiance,a为光线与平面法线的夹角,dw为单位立体角弧度值

BRDF - Bidirectional Reflectance Distribution Function 双向反射分布函数

  1. 反射: 一束光线,从某个立体角进入,打到某一单位表面,会被表面吸收,再从表面沿着各个方向辐射出去
  2. BRDF: 辐射角度能量的分布就是BRDF,相当于从radiance(入射),转换为irradiane(吸收),在转换为radiance(辐射)
  3. 从各个不同的角度射来的光线(不只是光源,还包含其他物体反射出来的光线,也包含自身作为光源发出的光),到达单位面积,形成的能量和即为该面积的irradiance,然后相机从某一点观察该平面,收到的能量值即为irradiance在该立体角的radiance
  4. BRDF也代表着不同反射材质
  5. 如果物体本身会发光,则irradiance需要加上该光源的irradiance
  6. 渲染方程: 包含自身发光以及其他地方入射光的反射,按算子展开 L = KE + K^2E + K^3E + ...,KE表示直接光照,K^2E表示经过一次反射之后的光照,以此类推
  7. L的值最后一定是收敛的,而不是跟底片曝光一样,底片曝光的本质是光能量在长时间的照射下,趋近于白色,而L是单位时间的一个值

概率论

  1. 随机变量: 随机值的变量
  2. 概率: 一定大于等于0,随机变量所有取值的概率和为1
  3. 期望: 随机变量的值*概率,求和
  4. 概率密度函数: 取极小的dx的变化值,f(x)为概率密度函数,则f(x)*dx = 当前x的概率
  5. 与概率值相关的函数f(x)的期望,通过概率密度函数的求解

蒙特卡罗积分

  1. 在积分域内不断采样,得到的结果求一个平均
  2. 采样点越多,结果越准确
  3. 求定积分

路径追踪

  1. whitted风格光线追踪存在的问题:
    1. 粗糙材质的光线应该如何反射?
    2. 漫反射材质之间没有反射,color bleeding
  2. whitted风格光线追踪是错的,但渲染方程是对的,需要解决的问题:
    1. 半球的积分
    2. 递归执行

未提及的概念

  1. photon mapping
  2. metropolis light transport
  3. VCM / UPBP
  4. 重要性采样理论
  5. 随机数采样: low discrepancy sequences
  6. mis: 多重采样
  7. pixel reconstruction filter
  8. gamma correction, curves, color space