GAMES101.闫令琪.08.高级光线传播与复杂外观建模(Lecture 18)
- https://www.bilibili.com/video/av90798049
 
高级光线传播
- Advanced Light Transport
 - Unbiased light transport methods
- Bidirectional path tracing (BDPT)
 - Metropolis light transport (MLT)
 
 - Biased light transport methods
- Photon mapping
 - Vertex connection and merging (VCM)
 
 - Instant radiosity (VPL / many light methods)
 
有偏无偏估计
- 无偏估计 unbiased
 - An unbiased Monte Carlo technique does not have any
systematic error
- 不管样本数是多少个,无偏估计的期望总是正确的
 - The expected value of an unbiased estimator will always be the correct value, no matter how many samples are used.
 
 - 有偏估计 biased
- 一致的 consistent
- 当使用的样本数很多时,期望会收敛到正确的值
 - the expected value converges to the correct value as infinite #samples are used.
 
 
 - 一致的 consistent
 
渲染中的有偏无偏
- An easier understanding bias in rendering
- Biased == blurry
 - Consistent == not blurry with infinite #samples
 
 - 有偏:模糊
- 一致性:无限的条件下是不模糊的
 
 
无偏的
双向路径追踪(BDPT)
- Bidirectional Path Tracing (BDPT)
 

- 光源出发发射出半路径,视点出发发射出半路径,BDPT
把这两条路径连接起来
- 思想简单
 - 实现复杂
 - 相对较慢
 
 - 有些情况下 BDPT 效果非常好(下图)
- 下图的特点:first-bounce 是 diffuse 的
- 如果用之前的路径追踪方法,不容易控制光线打到光源上
 
 
 - 下图的特点:first-bounce 是 diffuse 的
 

Metropolis Light Transport(MLT)
- Metropolis:人名
 - 利用 MCMC 方法实现
- MCMC:Markov Chain Mente Carlo
 - 根据当前的样本生成下一个样本
- 之前的蒙特卡洛方法不考虑当前样本的影响
 
 
 - 对于之前的蒙特卡洛采样方法,当你用于采样的 PDF 和原来的函数一致的时候,效果是最好的(方差最小)
 - MCMC 方法能够生成一些样本,使得这些样本的分布和原来的函数一致
 - Jumping from the current sample to the next with some PDF
 - Very good at locally exploring difficult light paths
 - 能够在找到蓝色光路的条件下很快找到红色的光路
 

- Works great with difficult light paths
- 很适合复杂光路查找的情景
 - 当找到一条光路之后,很快生成其他可能的光路
 
 - 两个例子(很难找光路)
- 半开着门
 - 焦散现象 caustic
 
 

- 缺点
- Difficult to estimate the convergence rate
- 很难估计收敛速度
 
 - Does not guarantee equal convergence rate per pixel
- 所有点的收敛速度不能保证一致
 
 - So, usually produces “dirty” results
 - Therefore, usually not used to render animations
- 这样这种方法在很难用于渲染动画
 - 相邻两帧可能有些点收敛了,有些没收敛,导致抖动
 
 
 - Difficult to estimate the convergence rate
 
有偏的
光子映射
- photon mapping
 - Very good at handling Specular-Diffuse-Specular
(SDS) paths and generating caustics
- SDS:例如之前在水底的反射
 
 - 很适合渲染焦散的场景
- 焦散(caustics):由于光线的聚焦产生的非常强的图案
 - 只是聚焦,没有发散的意思
 
 

一种实现方法
- 两步的方法(2-stage)
 
(1) Stage 1: photon tracing
- Emitting photons from the light source, bouncing them around, then
recording photons on diffuse surfaces
- 从光源辐射出很多的光子,反射,直到光子打到 diffuse 的材质上
 - 整理光子,记录光子的位置
 
 
(2) Stage 2: photon collection
- Shoot sub-paths from the camera, bouncing them around, until they hit diffuse surfaces
 - 从视点辐射出很多光线,反射,直到打到 diffuse 的材质上
 
(3) 计算
- local density estimation
- 局部密度估计
 
 - ideas:光子分布越集中的地方,应该更亮
 - 对于任何的一个着色点,取其最近的 N
个光子,求出包围他们的球体在表面占的面积
- 求出其密度
 
 
评价
- N 太小你会看到有噪声(noisy),N 比较大(但是不是无限)会看到图片模糊(blurry)
 
问题的产生
- 局部密度估计应该是 \(\dfrac{dN}{dA}\),而不是 \(\dfrac{\Delta N}{\Delta A}\)
 - 当 \(\Delta A\) 足够小的时候上面两个值才相等
 - 解决方法:发射出更多的光子,这样还是收集 N 个光子的话,面积就更小
- 发射出的光子足够多,结果就是正确的(一致性 consistent)
 
 - 只有当 N 是无限的情况下,才是完全正确的,N 不是无限的时候,多少会有点糊
 
另外的方法
- 取一个固定大小的范围,统计光子数量,然后计算局部密度
 - 始终是有偏的,而且不是一致的
 
Vertex Connection and Merging(VCM)
- 把 BDPT 和 photon mapping 结合在一起
 - ideas
- Let’s not waste the sub-paths in BDPT if their end points cannot be connected but can be merged
 - Use photon mapping to handle the merging of nearby "photons"
 
 

- 在 BDPT 基础上,如果有这样的 path
- 端点在同一个面上(不可能通过反射连接起来)
 - 端点离得的足够近
 
 - 此时认为从光源发出来的是光子,利用光子映射的方法进行计算(原来认为是一条 sub-path)
 
实时辐射度算法
- Instant Radiosity (IR)
 - 也被称为 many-light approaches
 - 思想:已经被照亮的面可以当作光源
 - 算法:
- Shoot light sub-paths and assume the end point of each sub-path is a
Virtual Point Light (VPL)
- 从光源打出一些光线,光线停在某一个表面上,把光线端点当作虚拟光源
 
 - Render the scene as usual using these VPLs
- 使用虚拟的光源计算光照
 
 
 - Shoot light sub-paths and assume the end point of each sub-path is a
Virtual Point Light (VPL)
 - 可以得到间接光照的结果
 - 优点
- 很快
 - 漫反射场景中表现较好
 
 - 问题
- 对于 glossy 材质的物体不能很好渲染
 - 当 VPLs 和待渲染的点离得较近的时候,会出现一些奇怪的高亮
- 和平方项有关,距离很近的时候,相当于除了一个很小的数
 
 
 

现状
- 暂时没有一个方法能够解决所有问题
 - 工业界:path tracing 居多,不高端,但是可靠
 
复杂外观建模
- Advanced Appearance Modeling
 - Non-surface models 非表面模型
- Participating media 散射介质
 - Hair / fur / fiber (BCSDF) 头发/毛发/纤维
 - Granular material 沙子
 
 - Surface models 表面模型
- Translucent material (BSSRDF) 半透明
 - Cloth 布料
 - Detailed material (non-statistical BRDF) 细节化的模型
 
 - Procedural appearance 程序化生成的模型
 
非表面模型
散射介质
- Participating media
- 散射介质 / 参与介质
 
 - Fog (雾),Cloud (云)
- 不是在表面上,定义在空间中
 
 - 当光线穿越过散射介质的时候,光线会被 吸收/散射
 

- 怎么散射?
- Phase Function(相位函数)
- 类似于 BRDF 规定了怎么反射,PF 规定了怎么散射
 
 
 - Phase Function(相位函数)
 

渲染方式
- 随机选择一个方向去反射
 - 随机选择一个方向直走
 - 对于路径上的所有点(shading point),跟光源相连
 - 不仅需要考虑渲染方程,需要考虑光线和体积之间的作用
- 思想是一样的,产生一些光线的路径
 
 
毛发
- 光线和曲线的作用
 - 两种高光:有色、无色
 
Kajiya-Ray Model
- 类似于之前的 specular + diffuse,光线打到圆柱上
- 散射出一个圆锥
 - 同时又有一部分散射到四面八方
 
 

Marschner Model

- 广泛应用的模型
 - R: reflection, T: transmission
- R:有一部分被直接反射
 - TT:有一部分被穿透头发,然后再穿透出来
 - TRT:穿透,反射,穿透
 
 - 头发是一个玻璃柱(小段),内部有色素(会吸收能量)
 

- 计算量很大,头发渲染非常难
 
动物毛发
- 使用头发的渲染模型渲染的效果不好
 

- 生物结构
- 动物毛发的髓质比较大,光线更容易发生散射
 
 

- 加入髓质的效果
 

Double Cylinder Model
- 双层圆柱模型(闫令琪提出)
 - 精确的描述髓质的作用
- Cortex:absorbs
 - Medulla:scatters
 
 - 效果会更亮
- s:scatter 散射
 
 

- 效果图
 

颗粒材质
- Granular
 - 一粒一粒的材质
- 糖、盐、沙子
 
 - 计算量很大
 
表面模型
Translucent Material
- semi-transparent:半透明材质,光线经过物体的时候发生吸收
 - translucent:光线经过物体的时候发生吸收和散射
 

- 例子
- Jade:玉石
 - Jellyfish:水母
 - 人的耳朵
 
 - 次表面散射:subsurface scattering
 
BSSRDF
- 对 BRDF 概念的延伸
 - \(S(x_i,\omega_i,x_o,\omega_o)\):从点 \(x_i\) 处入射,入射方向为 \(\omega_i\),从点 \(x_o\) 处出射,出射方向为 \(\omega_o\)
 - 渲染方程需要修改,需要对整个表面进行积分
 
\[ L\left(x_{o}, \omega_{o}\right)=\int_{A} \int_{H^{2}} S\left(x_{i}, \omega_{i}, x_{o}, \omega_{o}\right) L_{i}\left(x_{i}, \omega_{i}\right) \cos \theta_{i} \mathrm{d} \omega_{i} \mathrm{d} A \]
- 计算量很大
 
Dipole Approximation
- Jensen et al. 2001
 - 模仿次表面反射,效果差不多,但是计算量小很多
 - 现实观察
- 光线打到物体上,好像物体底下出现了一个光源,这个光源会照亮其周围的一片
 - 物理上的真实:上方还需要有一个光源
 
 

BSSRDF 效果
- 更接近物理真实,效果更好
 

- 惊人效果
- https://cgelves.com/10-most-realistic-human-3d-models-that-will-wow-you/
 
 
Cloth
- 布料
 - 布料的层级
- 纤维 fibers
 - 股 ply
 - 线 yarn
 - 布料 cloth
 
 

- 表面模型和针织的方向、图案有关
 - 根据形状计算 BRDF
 - 有些材质不能解决
- 天鹅绒,不在平面上
 
 

- 更准确的做法:空间分布的体积
- 空间体积划分,最终好像就在渲染云一样
 - 计算量很大
 
 - 逐纤维渲染
- 计算量很大
 
 
Detailed Appearance
- 渲染的结果看着不真实的原因之一:过于完美
 - 真实世界很复杂
 - 手动加入划痕,刷(各向异性)
 - 微表面模型
- 表面法线分布:\(D(h)\)
 - 简单的正态分布等过于完美
- 法线贴图
 
 
 - 计算复杂度很高,需要渲染很久
- 原因是表面都是镜面,很难让从视点发出的光线打到光源
 - 很难找到一条合理的光路
 
 - 解决方式:BRDF over a pixel
- 一个像素出去的光线会覆盖一个区域内的微表面(patch),我们将这一部分区域的分布拿出来,替代原本的光滑的法线,并且用在微表面模型里
 - p-NDFs
 
 

- 海面的模拟:波光粼粼的效果
 
波动光学
- Waved Optics
 - 当物体的尺寸和光的波长相近的时候,会发生衍射、干涉等现象的发生(光不再沿直线传播)
 - 例子:
- 小黑屋里面,关掉所光源,只用一个点光源照亮金属片,会发现金属片的表面有各种各样不同颜色的点
 
 - 波动光学解出的 BRDF,效果很好(能够模拟出上面的情况)
 
程序化外观
- noise function
 - Compute a noise function on the fly.
- 随用随取(不需要生成)
 
 - 木头纹理
 - Perlin Noise
 - Houdini:程序化生成材质(需要生成)