這篇文章是應麥哥要求寫的,在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: