这篇文章是应麦哥要求写的,在Arnold大行其道,各类渲染器积极修改算法增长path tracing的今天. 想写一篇文章简单讲解一下这些基于物理的渲染系统的工做流程是什么和背后的原理,先抓了一张PBRT书上的插图来讲明:php
再上一张图解释下光线追踪一类算法的基本原理:算法
渲染流程segmentfault
为何要叫intergrater呢, 由于Path tracing 和这一类的算法,是利用蒙特卡洛积分去积分渲染方程,获得正确结果---本质上是利用随机方法解高维积分--这个积分是光照、可见性、散射和余弦项的乘积--的过程。 这个过程包括了采样和求蒙特卡洛估计量,而intergrater正是在sampler采样(对屏幕,对表面的BSDF等)以后求积分值的。架构
了解蒙特卡洛方法本质,看这里:app
http://www.opengpu.org/forum.php?mod=viewthread&tid=6768&fromuid=10107函数
再来看看Mitsuba(类PBRT的一个渲染器)中一个intergrater的定义(Path tracer):优化
计算radiance的函数:ui
能够看出对BSDF和light分别做了采样,而后计算radiance的值并组合,同时还用迭代的方法求间接照明,这种方法是一种有效的加快积分收敛的采样办法,后面会提到。spa
以上是PBRT类的渲染器的工做流程,Arnold或者mantra的办法都是相似的,只不过在软件架构上会有所区别。图片
关于采样
采样是渲染流程中最核心的步骤,大部分提升效率的办法也都是优化采样过程,渲染流程中会进行的采样过程主要有:
提升采样效率的主要方法就是重要性采样和多重重要性采样,重要性采样的基本思想是,将采样工做集中到被积函数值相对比较高的地方,那么就能够更有效率地计算出精确的估算值。多重重要性采样则提供了一种能够对不一样分布中的采样进行加权的方法。上面的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: