基於物理的渲染(一):什麼是渲染?

(編註:本文作者有很神奇的能力,就是可以把非常複雜的概念用「人話」講出來。經常一個我思考半天的概念,他三兩句話就解釋清楚了。他閱讀時特別快,因為他只看人話的部分。下面滿滿都是他講的人話。)

2017年是基於物理渲染的時代,所以我在這裡不講其他的渲染手段,只講PBR。那究竟什麼是PBR?

PBR(Physically based rendering)是用來執行下面渲染公式的一個流程:

十臉懵逼的你問,上面的公式看不懂怎麼辦,沒關係,我用人話給你講:

現在的這個宇宙里我們所處的環境里大致是這樣的。

一粒光子從光源被射出,沿著直線飛行直至擊中一個物體表面,這顆光子被改變了方向後繼續沿著直線前往下一處,如此反覆,直到最終有那麼一粒光子幸運擊中我們的視網膜,才會得以在我們的腦中形成一個彩色的亮點。

當有無限多的光子時,一束束的光子沿著相似的方向前行,遇到一個物體它們的方向整體被改變,但每一顆光子因為擊中物體表面的角度略微不同,被改變的方向也不同。

從宏觀來看,光從物體表面各個位置反射到我們眼中的亮度變化,構成了我們用於理解這個物體質感的基礎。

一束光線,根據光線擊中物體的角度不同,物體接受到的光照,和它反射出的光照,兩者的比例關係我們稱之為BSDF (bidirectional scattering distribution function),或者光照模型

一個BSDF是光線被反射或吸收概率的描述,一種BSDF就是我們認知中一種材料的概念。

BSDF是一種光線和物體交互的粗略估計和概括,因為一個在微觀上有著粗糙表面的模型我們沒有辦法在模型層面上建立,我們只能在宏觀範圍上去概括光線在這些微觀表面上是怎樣反應的。

(丁熏在此解釋BSDF只是描述物體和光交互的一種方式,未來可能會被其他更好的方式替代)(編註:特效圈的人應該知道它,丁丁)

我們身邊的各種物體都有不根據光照而變化的固有色,這些固有色的部分在接收到光線時,會吸收某個頻率的光線,反彈其他頻率的光線。

一束紅光照在純綠色的物體上,我們看到的是純黑色。

一束包含所有可見頻率的白光,照在只吸收藍色光的物體上,紅色和綠色光會被反彈到我們的眼睛裡,之後我們的大腦會將它解讀為黃色。

當光線擊中了具有透明性質的物體上,部分光子會被反彈,另一部分會被改變方向,折射到另外一邊。這一過程中如果物體吸收某一顏色的光線,被折射的光線會改變顏色。透過一副綠色墨鏡看到的景象就是這兩種原理的結果。

當這個透明的物體中具有大量雜質,導致我們無法看清透過它折射的物體,我們稱之為透光。光線穿過一個透光物體時會在內部的雜質上進行大量微觀的反射和折射,這個過程我們如果發生在一個沒有明確表面物體的內部(煙霧,雲),我們稱之為散射

如果光線散射發生在一個具有明確表面物體的內部(大理石,濃稠液體,生物皮膚),我們也可以稱之為次表面散射

BSDF是簡化版的BSSRDF。而通常大家所說的BSDF是反射(BRDF)和折射(BTDF)的總和,也用來(錯誤地?)代指次表面散射(BSSRDF)等各種不同的BxDF。大家所說的shading model和shader也或多或少用來代指BxDF。

光子本身在行駛過程中能量不會衰減,但因為光源產生的光基本會沿著所有方向一起向外射出,光子數目恆定的情況下,物體到光源的距離直接影響物體所接受到光的強度。

距離越遠,因為物體可覆蓋光的角面積越小,擊中物體的光子量就越少。這個衰減趨勢大致呈平方反比,我們通常稱之為平方衰減。(不過,請想想為什麼一般我們渲染太陽光都選用無衰減的平行光?)

同樣因為這個角度,光打在一個粗糙的表面和一個光滑的表面上,所反射光線張角產生變化,光量一致的情況下,表面越光滑,張角越小,光線越密集,也就更明亮。

這個張角和亮度的變化關係,叫能量守恆。我們在雨夜的街道路面上看到的燈光反射要比乾燥的路面上範圍小的多,明亮的多。

基於物理的渲染器多多少少都會把能量守恆當作高優先順序需求作為考慮。

在模擬光照的時候,能量守恆可能代指幾種不同的方面,但它們要做的都是在宏觀上估計出光照在不同物體上亮度的變化。

假如你按照上述原理運行一下模擬就會發現,即便使用上億的光子進行計算,因為我們眼睛相對於整個場景來說尺寸太小,最終能落入我們眼中的光子十分有限。

所以在渲染器實際的工程設計和實現上,光線反彈的計算是逆向進行的:我們從眼睛射出光線,在場景中不斷碰撞反彈,每次遇到物體與之交互並改變自身屬性後繼續穿行,一直到最終遇到光源停止,這個過程叫做光線追蹤。(現實中因為設計優化並不是所有光線都可以一直循環到最終碰到光源才中止,也不是所有渲染器都是只有逆向追蹤。)

每一個光子穿行的軌跡叫做一個採樣

每次光子擊中一個物體,根據物體的材質屬性,可能會分散成更多的採樣軌跡。採樣越多,計算越準確,渲染速度越慢。

以上,就是用人話解釋的基本渲染原理。

知道了這個基本概念後,我們就開始登上這條渲染的破船了,請耐心等待後面更多的乾貨!

系列文章:

基於物理的渲染(二):光照的組成部分

我們公司的渲染大神告訴我,可以提升渲染速度的最簡單的辦法:將此文點贊即可獲得五倍提升!我不知道他說的是不是真的但是他那麼牛逼如果我是你我肯定要試試的……

本文作者信息:

牛闖,現任倫敦工業光魔特效技術指導。

正在以導演身份籌備獨立電影過程中,有意向合作者請發信到個人郵箱聯絡。

電影工作聯絡:

LinkedIn: linkedin.com/in/chuangn

Email: chuang.film+wx@gmail.com

其他社交媒體:

知乎: Ovs牛大夫

Weibo: Ovs牛大夫

Instagram: ovspianist

本文來自「闖特效」公眾號,轉載請聲明。

推薦閱讀:

玩轉 React 伺服器端渲染
X-Ray Vision
木地板材質真沒你想像的那麼難啊
Unity5 PBR如何實現天氣系統的雪景效果

TAG:电影 | 渲染 | 电影特效 |