这篇文章是应麦哥要求写的,在Arnold大行其道,各种渲染器积极修改算法增加path tracing的今天. 想写一篇文章简单讲解一下这些基于物理的渲染系统的工作流程是什么和背后的原理,先抓了一张PBRT书上的插图来说明:
再上一张图解释下光线追踪一类算法的基本原理:
渲染流程
- 发射光线: 就是sampler根据camera的信息发射光线———也就是对屏幕上像素点的采样,我们可以叫这些光线为eye ray.
- 空间划分,求交: 之后渲染器的任务是追踪这些光线并和物体求交,这之中会运用到空间划分的加速结构来加速求交, 比如最简单的八叉树之类.
- 积分,shading: 而求交得到surface信息会传给intergrater进行积分计算和shading,intergrater就是真正执行你的光传播算法的地方,比如path tracing; Photon Mapping; Bidirectional Path tracing 等.
- 追踪次级光线,计算间接照明: 当然,这些所有的算法都要求渲染系统还会去追踪次级的光线,也就是surface, 反射, 折射等产生的次级光线,并迭代进行积分和shading.积分和shading的结果就是每个像素的radiance.
为什么要叫intergrater呢, 因为Path tracing 和这一类的算法,是利用蒙特卡洛积分去积分渲染方程,得到正确结果---本质上是利用随机方法解高维积分--这个积分是光照、可见性、散射和余弦项的乘积--的过程。 这个过程包括了采样和求蒙特卡洛估计量,而intergrater正是在sampler采样(对屏幕,对表面的BSDF等)之后求积分值的。
了解蒙特卡洛方法本质,看这里:
http://www.opengpu.org/forum.php?mod=viewthread&tid=6768&fromuid=10107
再来看看Mitsuba(类PBRT的一个渲染器)中一个intergrater的定义(Path tracer):
计算radiance的函数:
可以看出对BSDF和light分别作了采样,然后计算radiance的值并组合,同时还用迭代的方法求间接照明,这种方法是一种有效的加快积分收敛的采样办法,后面会提到。
以上是PBRT类的渲染器的工作流程,Arnold或者mantra的办法都是类似的,只不过在软件架构上会有所区别。
关于采样
采样是渲染流程中最核心的步骤,大部分提高效率的办法也都是优化采样过程,渲染流程中会进行的采样过程主要有:
- 屏幕空间的采样,这个采样的优化方法也很多,自适应采样;低差异性采样等。
- BSDF的采样,就是根据BSDF形状产生散射的出射光方向。
- 相函数采样,体渲染时产生散射光方向。
- 对光源的采样
提高采样效率的主要方法就是重要性采样和多重重要性采样,重要性采样的基本思想是,将采样工作集中到被积函数值相对比较高的地方,那么就可以更有效率地计算出精确的估算值。多重重要性采样则提供了一种可以对不同分布中的采样进行加权的方法。上面的Path tracing intergrater, 就是利用了不同的采策略分别对光源和BSDF采样,然后再用多重重要性采样组合两种结果.
关于提高采样效率,看:
http://www.opengpu.org/forum.php?mod=viewthread&tid=7363&fromuid=10107
为什么production renderer大多采用Path tracing类算法
大多数production renderer采用的是学术界30几年前的算法:Path tracing with MIS(多重重要性采样).而不是各种新研究出的算法. 主要有两个原因:
算法实现的复杂度, 很多算法实现起来很复杂, 对这些production renderer的架构是一个冲击, 大多数production renderer关注的feature是兼顾生产过程中的细节,如果这些算法要兼顾到bump, displacement,纹理贴图这些细节的话,工作量非常巨大.
算法本身的适应性, 一些实现起来比较复杂的算法往往是针对某些特殊的场景,而在大部分普通场景下效率不一定比普通算法高,这就导致很多人会采用一个制作上的办法去规避复杂场景(比如image based lighting)而避免去改变渲染器架构.
当然目前的趋势是随着科研界研究的成熟,很多新算法会出现在production renderer中,比如renderman 19 就支持Bidirectional path tracing(也是十几年前提出的算法了) 和Vertex connecting and merging.
总结
Arnold在电影环太平洋和地心引力的成功证明了PBR渲染是大势所趋, 因为随着机器算力的提升,以前看上去运算量巨大的光线追踪任务也可以在短时间内完成. 看见过国内的TD抱怨Arnold渲染慢 占内存的,只能说该增加渲染节点了. 跟不上趋势的总要被淘汰, 因为机器花的时间永远比艺术家的时间便宜.
PS: 如果要详细了解Physically based rendering 的原理和数学方法,包括采样策略,path tracing 算法原理,请看这篇英文的thesis:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。