基於物理的渲染(二):光照的組成部分
基於物理的渲染(二):光照的組成部分
為了保證通用性,我這裡盡量不去以任何一種渲染器的習慣作為前提假設,而是盡量地用物理和常識來描述圖像的組成元素。
首先要強調一點就是,無論是幾種相同和不同的光源產生的光,還是拆分成下面的組成部分,在合成環節把他們混合成最終燈光效果的時候,它們之間的混合方式只有一種:相加!光不應該也不能用其他的混合方式混合,用其他方式去混合燈光會造成能量失衡,導致最終畫面光感不準確。
按照光線在物體的不同位置交互,從原理和易操作性上來劃分我們有下面幾個組成部分:
- 反射,包括漫反射,和高光反射。
- 折射,包括模糊折射,和清晰折射。
- 散射,包括無表面的散射,和次表面散射。
- 自發光,包括產生光子的自發光,和不產生光子的自發光。
每個渲染器完成這些光照元素的方式都不完全一致,每個公司自己開發的Shader也有不同的處理方式,但是萬變不離其宗,他們最終試圖去描述的內涵都是一致的:
漫反射,高光反射,模糊折射和清晰折射的亮度加在一起的總和不超過入射進來的光線。為了保持能量守恆,一個屬性的增強勢必導致另外其他的屬性減弱。他們根據美學要求可以繼續往下細分,比如ILM的高光就經常使用兩個不同銳度的高光反射。
漫反射和高光反射在某些時候是無法區分的,它們本質上也是一樣的光照原理。反射角很大的高光反射,範圍可能會變得和漫反射一樣大,在這種情況下他們可以互換。但取決於渲染器的設計,用高光反射的功能實現漫反射的效果可能會導致渲染效率下降。
折射也是一樣的道理,清晰折射是物體表面光滑,內部清澈的情況下會產生的效果。當物體表面變得粗糙,光線被表面上許多微小的切面折射到不同方向,宏觀上看折射開始變得模糊。如果物體內部開始變得渾濁,光線在內部便會開始與內部的雜質顆粒進行交互,宏觀上產生了次表面散射現象。雜質越大越密集,光線穿透材料的可能性就越低,我們看到的畫面就越多被次表面散射層佔據,折射層的含量就越少。
有些物體自身有發光性質,我們稱作自發光。CG中的純光源只是一個具有自發光性質但本身不被渲染的物體。火焰即有自發光,又包含可被渲染的介質。在CG中,有些物體具有自發光性質,但是不產生光子照亮其他物體,這種物體通常被用來製作全景環境圖供其他物體反射或折射。如果一個場景中只有特效模擬的火焰一種發光物體,那這個火焰便會作為一個渲染物體,它產生的光子作為一個光源存在。在PBR的場景里,任何物體都可能會影響任何其他物體。
一般我們也用不產生光子的自發光來渲染物體本身的固有色層,比如一張具有木紋的桌子,固有色層如決定單獨輸出,我們可以用這樣的方式將它渲染出來。在合成階段它應該和漫反射層相乘得到具有固有色的漫反射層,高光反射保持和光源顏色一致。(導電的材料的高光反射也會繼承材料本身的顏色,比如黃金等,高光顏色要和材料顏色一致。)
在前一篇文章說過,散射根據是否有一個明確表面的內部,我們會將他們分為無表面散射,和次表面散射。他們的計算原理差異不大,區別在於這一層光照存儲在什麼位置和怎麼去使用他們。次表面散射將光照存儲在物體的表面,無表面散射將光照存在連續的透光介質中(Participating media)。
散射層可以當作一個十分模糊的折射層,或者一個自發光層來看待(但是要保證能量守恆)。散射甚至可以用模糊的折射或者一個模糊的自發光層來粗略模擬。比如比較薄的物體內部產生的瓷表面散射,和它模糊折射的光源差異不大。一個爆炸的煙霧模擬在渲染的時候也可以把火做模糊處理,作為煙的自發光層加入到最終渲染里,這樣可以很好地模擬多次計算的散射效果,而效率確是真實計算的上百倍之高。
散射和折射除了背光尤其明亮,過渡比較通透除外,通常很顯著的效果是光在介質內部反彈的時候顏色會產生變化。海水吸收紅色光較多,所以光線到海底越深的位置剩下的光就越偏向藍綠色。燃燒產生的煙通常會吸收藍色光,導致越厚的煙霧越會偏向橙黃色。粒子十分細密(低於光波長)的煙霧反而會被留下藍色光,比如香煙產生的煙霧,這種現象被稱作Rayleigh Scattering,屬於現實常見但渲染里不常見的效果,通常靠手動調整得到。
一些表面紋理奇異的物體,通常因為有多層可以折射光線的薄膜所致,會產生彩虹色的反射或者折射。肥皂泡上的彩虹色紋理就是最常見的例子。要想模擬這種紋理,我們需要深入到把光線分離成不同頻率分別使用不同的折射率去折射的方法,但這種方法需要一些開發工作和更長的渲染時間,也不一定便於藝術家控制,所以大家也經常採用作假的方式去實現這種效果。一個很普遍的方式就是通過把彩虹色的紋理根據物體上Fresnel數值映射到表面上來實現。但這些作假的方式不會適用所有範圍,比如模擬光線在鑽石內部的多次折射產生的昂貴彩虹色就無法實現。(鑽石這種東西呢,該買就得買真的。)
多次反彈光: 間接光照
上述的所有光照的分解元素,在PBR渲染器渲染的時候光線都會在各自的軌跡中反彈多次。月球上物體的純黑色陰影是因為沒有大氣產生的藍天對地面產生多次光線反彈,相反我們也聽說過城市高樓的玻璃板反光可以將路面上停泊的轎車面板烤熱燒焦。我相信大家對這個概念都有所了解,所以我不過多說明。
在我們拆分光照元素的時候,通常也會把直接擊中物體反彈到我們眼中的光叫做直接光照。這個光照光影明確,在只考慮直接光照的世界裡,常規的電影片場打光的方式都無法數字重現。(反光板,柔光布,黑旗等)
想要更好的重現現實世界中的光照,我們必須要考慮進除了第一次反彈之外的反彈軌跡。這些軌跡產生的光照我們稱為間接光照。間接光照相比直接光照一般很弱,但是缺少這一層光照對真實感的建立會有很大損傷。
為了提高速度,一般渲染器會把一條光照軌跡劃分成反射光線,陰影光線等。這樣歸類的意義在於在每次反彈計算中,都會在場景許多新的位置產生新的反彈光線,它們可能包含反射的太陽光,折射的人工光,散射的火焰光等等許多不同種類的光線。如果各種光線都相互有影響,很可能把已經很慢的渲染直接計算到無法停止的地步。為了提速,我們在計算漫反射的間接光照時一般不去考慮高光反射對它的影響。這樣的設計很顯然在一些場合下是不夠的,所以渲染器一般也會給你一些開關或者相應的編程介面讓你允許集中不同光線之間的相互影響。畢竟,電影也是一門造假的藝術,當視覺上的差異不大時,我們沒必要那樣去糾結準確性。
我們可以看到,隨著我們需求的增長,渲染器需要計算的光線數量越來越多。一個好的渲染器不僅應該提供給我們這些功能,也應該根據我們對藝術指導的需求和製作的流程,適當地削減和優化我們的渲染計算。每個渲染器優化的側重點都不同,作為渲染藝術家我們最好了解每個渲染器的優缺點,根據它們的特點去選擇適應我們項目的渲染器。
渲染器沒有優劣之分,用渲染器的人有。
這篇文章有個神奇的功效,只要你轉發到朋友圈愛情事業就會雙收。有個讀者通過轉發得到了自己喜歡的鑽石:
GIF/1K
手動打賞連接:
本文作者信息:
牛闖,現任倫敦工業光魔特效技術指導。
正在以導演身份籌備獨立電影過程中,有意向合作者請發信到個人郵箱聯絡。
電影工作聯絡:
LinkedIn: linkedin.com/in/chuangniu
其他社交媒體:
知乎:Ovs牛大夫
Weibo: Ovs牛大夫
Instagram: ovspianist
TAG:闖特效 |