目录
1 渲染前沿
1.1 有偏vs无偏
1.2 无偏光线传播方法(Unbiased light transport methods)
1.2.1 双向路径追踪(Bidirectional path tracing,BDPT)
(1)双向路径追踪(BDPT)举例
1.2.2 Metropolis 光线传播(Metropolis light transport,MLT)
(1)Metropolis 光线传播举例 - 优点
(2)Metropolis 光线传播举例 - 缺点
1.3 有偏光线传播方法(Biased light transport methods)
1.3.1 光子映射(Photon mapping)
(1)光子映射实现方法
1.3.2 VCM:Vertex connection and merging
1.4 实时辐射度 (Instant radiosity,IR) (VPL / many light methods)
2 材质模型前沿
2.1 非表面模型(Non-surface models)
2.1.1 散射介质(Participating media)
2.1.2 毛发/毛皮/纤维(Translucent material (BSSRDF))
(1)Kajiya-Kay模型
(2)Marschner模型
(3)动物毛发模型
动物毛发模型 - 双层圆柱模型
2.1.3 颗粒材料(Granular material)
2.2 表面模型Non-surface models
2.2.1 透光材料(Translucent material (BSSRDF))
2.2.2 布料(Cloth)
2.2.3 细节材料(非统计BRDF)(Detailed material (non-statistical BRDF))
2.3 程序化外观Procedural appearance
1 渲染前沿
1.1 有偏vs无偏
无偏的蒙特卡罗方法估计出来的估计值的期望永远不变,这就是一种“无偏的”估计。
相反,如果蒙特卡洛方法估计出的期望和最后要的值不一样,这种就是“有偏的”估计。如果此时样本量足够大,期望值收敛到正确值,那么这个叫做“一致的”。
1.2 无偏光线传播方法(Unbiased light transport methods)
1.2.1 双向路径追踪(Bidirectional path tracing,BDPT)
之前说的路径追踪是从相机产生一条路径,直到连接到光源。
现在从光源和摄像机分别出发,形成多个“半路径”,然后双向路径追踪将“半路径”的端点连接起来。
(1)双向路径追踪(BDPT)举例
可以看到,左右图片对一个像素进行32次的采样,右图使用了BDPT明显效果更好。
上面的例子也说明:当光源比较集中时,适合使用BDPT。
BDPT运行很慢!
1.2.2 Metropolis 光线传播(Metropolis light transport,MLT)
马尔科夫链:根据当前的样本,可以在它周围生成一个新样本。而且可以生成以任意的函数的PDF形状为分布形状的样本。
(当采样的PDF和要积分的函数形状一致的时候,误差最小。)
也就是说,给定任何一条路径,可以生成与之相似的其他路径。
已有蓝色路线,可以通过一些扰动在周围产生红色路线。
(1)Metropolis 光线传播举例 - 优点
·MLT适合做复杂场景、无偏。
光线->水面->水底->水面
这样的路径其实很难处理。
(2)Metropolis 光线传播举例 - 缺点
·很难估计一张图的渲染时间
·局部方法,各个局部的收敛速度不一样,画面容易很脏
·无法用于渲染动画,上一帧和下一帧的抖动会很大
1.3 有偏光线传播方法(Biased light transport methods)
1.3.1 光子映射(Photon mapping)
·该方法非常适合处理复杂的SDS路径。
·能够生成 caustics 现象(由于光线的聚焦而产生的一些非常强的图案)。
(1)光子映射实现方法
光子映射有很多实现方法,这里介绍一种。
第一步:光源辐射出光子,规定光子打到diffuse物体上就停止,并记录。
第二步:从眼睛/摄像机打出“半路径”,打到diffuse物体上就停止,并记录。
第三步:计算局部的密度估计。
光子分布越集中的地方越亮,光子分布越少的地方越暗。
·现在给一个点,找它周围最近的N个光子。(经典算法问题:寻找最近的N个邻居)
·计算出这N个光子占据的面积
·计算光子密度:数量/面积
这个N取的越少,噪声越大;N取的越大,越模糊。
为什么是有偏估计?
这里的光子密度,理论上应该是计算当前一个点的密度,我们用确定大小的面积和数量来近似了。
当有足够多的光子,那么就得到正确的结果,它是“有偏的”,但是“一致的”方法。
在渲染中理解“有偏”和“一致”
“有偏” = 图片有模糊
“一致” = 样本无限时,图片不模糊
1.3.2 VCM:Vertex connection and merging
VCM结合了:双向路径追踪和光子映射
双向路径追踪中,如果“半路经”没有交会到一个点上,而是挨得比较近,那么此时VCM为了不浪费这种路径,认为其中一半过来的是光子,然后使用光子映射做。
1.4 实时辐射度 (Instant radiosity,IR) (VPL / many light methods)
主要思想:已经被照亮的部分都看作是光源,可以照亮别人。
优点:很快速、适合处理漫反射物体
缺点:接缝处异常发光、不能用于glossy材质的物体
2 材质模型前沿
2.1 非表面模型(Non-surface models)
2.1.1 散射介质(Participating media)
光在行进过程中,穿越散射介质,在光通过散射介质的任何一点,它都可能(部分地)被吸收和散射。
比如光通过云,可能被冰晶分散到各个方向
也可能接收到其他光线
也有可能被吸收完:光穿不过乌云
相位函数:决定光线如何散射,散射到哪个方向去。
随机选择一个方向跳跃,随机选择一个距离直线,在每个“阴影点”,连接到光。
渲染方程只告诉我们光线与物体表面的作用,没告诉我们光线与体积如何作用。这方面的数学计算需要依靠其他的工具。
上面是在影视和游戏作品中的散射介质。
巧克力等一些材质也可以被当作散射介质,尽管我们可能看不到,但一部分光线是可以穿透他们的表面,并在物体内部发生一些作用并弹出的。
2.1.2 毛发/毛皮/纤维(Translucent material (BSSRDF))
需要考虑光线和一个曲线如何作用。
(1)Kajiya-Kay模型
这种模型比较古早
如图,将头发抽象为一个圆柱。
到达其上的光线会有两种反应:
1.被均匀反射
2.朝圆锥形状的区域反射
(这里可以理解为漫反射和镜面反射)
这种模型的渲染效果如下:
(2)Marschner模型
这是一个被广泛应用的模型。
如图,将头发抽象为表面有扰动的一个玻璃圆柱。
到达其上的光线会有以下几种反应:
1. 朝圆锥形状的区域反射(R)
2. 穿进头发内部-再穿出头发(TT)
3. 穿进头发内部-在毛发内壁发生反射往回走-穿出头发(TRT)
渲染效果:
与单根头发作用还不够,需要考虑头发和头发之间的作用,称作多次散射,计算量就很大了。
(3)动物毛发模型
人类头发模型能不能用于描述动物毛发?
只能说:有区别
下图左边展示了人类头发模型的渲染效果,右图是专门的动物毛发模型渲染效果。
研究人员(闫神)通过研究人类毛发和动物毛发的生物学特征,发现:
动物毛发中的最内层的髓质(Medulla)占比非常大,光线进去之后更容易发生散射。
逐渐增加髓质的比例,动物毛发的质感会发生明显的变化。
有髓质和无髓质的人类毛发渲染效果也差别很大。
动物毛发模型 - 双层圆柱模型
如图,将头发抽象为表面有扰动的一个双层玻璃圆柱。
到达其上的光线会有以下几种反应:
1. 朝圆锥形状的区域反射(R)
2. 穿进头发内部穿过髓质 / 没打到髓质 - 再穿出头发(TT)
3. 穿进头发内部-被髓质散射(TTs)
4. 穿进头发内部-在毛发内壁发生反射往回走-穿出头发(TRT)
5. 穿进头发内部-在毛发髓质中发生两次散射-穿出头发(TRTs)
效果展示:
2.1.3 颗粒材料(Granular material)
我们怎么描述一粒一粒的东西。
一般用到的方案是:定义一堆颗粒中每种颗粒所占的比例。
计算量非常大。
到2020年为止,颗粒材质也没有得到比较好的解决。
沙丘渲染效果:
皮克斯炫技视频中的沙子渲染:
2.2 表面模型(Non-surface models)
2.2.1 透光材料(Translucent material (BSSRDF))
透光材质的典型代表:玉石
透光Translucent:光线从某个位置进入物体,经过一些作用,再从另一个位置射出。
(透光Translucent与半透明semi-transparent是有区别的)
牛奶、人的皮肤等物体都会发生次表面散射。
次表面散射可以看作是BRDF的一个延申。
BRDF:光线打到了这个点,再从这个点反射。(全过程发生在一个点上)
次表面散射BSSRDF:光线打到了这个点,但可以从其他点出去。(规定了:从哪个点xi、哪个方向进来wi;从哪个点xo、哪个方向出去wo)
人们认为次表面散射现象可以等价于物体里面有一个光源在发光。
为了物理上的真实,给光源做成对处理。
用此方法用来近似次表面散射的结果。
渲染效果:
2.2.2 布料(Cloth)
布料实际上是多根纤维多次缠绕形成的。
纤维 -> 股 -> 线 -> 通过机器纺织或者手工编织
Fibers -> Ply -> Yarn -> 通过机器纺织或者手工编织
根据各种不同的编织方式可以建模出BRDF模型。
有一些立体面料用BRDF明显无法很好地描述,比如天鹅绒。
所以更准确的方法是:把织物看作是空间中分布的体积,即当作散射介质来渲染,但计算量也更大。
或者,还可以像真实的纤维一样来渲染布料,每根纤维都算。
2.2.3 细节材料(非统计BRDF)(Detailed material (non-statistical BRDF))
现今渲染器渲染出的物体有一个问题:过于完美。
真实的世界往往充满瑕疵和磨损。
图2加入了划痕、图3加入了各向异性。
细节模型可以带来更多真实感。
理论的法线分布很完美,实际上的法线分布会有扰动。
如果要求细节:物体法线分布基本符合物理规律,但会存在扰动。
法线贴图200k*200k,渲染时间很长,大概要1个月。
耗时长的原因:路径难以采样
·考虑一个针孔摄像机和一个点光源。
·认为每个微表面是一个镜面,镜面反射方向确定。
·此时就很难让针孔摄像机发出的光线反射到光源,光源发出的光线同时难以到达摄像机
改进:
·考虑一个像素覆盖多个微表面
·把这个区域的微表面法线分布,替代原本光滑的分布。
选取不同范围的微表面,显示的法线分布的特点不同。
选取不同形状特点的微表面,显示的法线分布的特点也不同。
渲染示例:
其实当物体非常小的时候,用几何光学就不完全正确了,就需要考虑衍射和干涉现象,那么就会涉及到波动光学。
几何光学和波动光学算出来的BRDF很像,但也都有各自的特点:波动光学不连续。
2.3 程序化外观Procedural appearance
程序生成:用一定的方式去指导它的生成,而不需要真的去存储它的三维纹理材质。需要使用的时候动态查询即可。
噪声函数,可以得到许多不同的材质表现。
生成地形
生成水面
生成木头纹理