這回的目標(biāo)是在tonemapping中模擬相機(jī)一部分特性,這次的參考資料是來自寒霜引擎。在實(shí)作之前,我們首先得搞清楚pixel內(nèi)到底儲(chǔ)存的是甚麼東西。
Render target中每個(gè)pixel代表底片中的一小塊區(qū)域,寒霜引擎在pixel中儲(chǔ)存的光線單位是使用illuminance而不是irradiance。illuminance是光度單位,每種光度單位都可以對(duì)應(yīng)到一個(gè)輻射量單位,光度單位之間的關(guān)係可以直接套用輻射量單位之間的關(guān)係,先前已有說明因此不再詳述。
Radiant energy | J (焦耳) |
Luminous energy |
lm·s |
Radiant flux |
J/s or W (瓦特) |
Luminous flux |
lm (流明 Lumen) |
Radiant intensity |
W/sr |
Luminous intensity |
lm/sr or cd (燭光 Candela) |
Irradiance |
W/m2 |
Illuminance |
lm/m2 or lx (勒克斯 Lux) |
Radiance |
W/(m2·sr) | Luminance |
lm/(m2·sr) |
▲輻射量單位與光度單位對(duì)應(yīng)表
光度單位大都以我的名字開頭 (毆飛
寒霜選擇illuminance有數(shù)個(gè)理由,首先現(xiàn)實(shí)中的光源通常都使用光度單位,美術(shù)也使用光度單位。若render target採(cǎi)用irradiance,引擎多了一個(gè)轉(zhuǎn)換功夫,美術(shù)除了為每個(gè)光源提供流明之外,還必須提供發(fā)光效率,增加美術(shù)的負(fù)擔(dān)。
發(fā)光效率為100%時(shí),luminous flux與radiant flux的比值為683,此數(shù)值可被引擎用來作光度與輻射量單位間的換算。因?yàn)槿搜蹖?duì)不同波長(zhǎng)有不同的敏感度,所以即使兩種光源消耗相同能量,兩者發(fā)出的不同光譜有可能造成發(fā)光效率的不同。由下表可知不同光源之間效率相差數(shù)倍或數(shù)百倍,無法為了省功夫而全部採(cǎi)用同一個(gè)預(yù)設(shè)值。
燭光 | 0.04% |
白熾燈 | 2%~5% |
LED燈 | 0.66~22% |
螢光燈 | 8%~15% |
太陽 | 13.6% |
▲常見光源之發(fā)光效率,取自wiki
要得到發(fā)光效率除了用光譜計(jì)算,就只能靠商品上的標(biāo)示了。雖然偶爾還是能在購(gòu)物網(wǎng)站上找到有標(biāo)示的商品,不過還不如引擎內(nèi)全面改用光度單位來的省事。
▲某購(gòu)物網(wǎng)站的商品頁面只教你怎麼辨識(shí),但不提供數(shù)據(jù)... (怒
說到購(gòu)物網(wǎng)站,燈泡的顏色通常只會(huì)標(biāo)示色溫,而不是RGB。色溫即黑體輻射體處於某溫度時(shí)所發(fā)出的顏色,例如色溫2700K代表黑體輻射體的溫度2700K時(shí)所發(fā)出的顏色。為了得知燈泡的顏色必須實(shí)作色溫轉(zhuǎn)換RGB,我的實(shí)作參考了這個(gè)網(wǎng)站。簡(jiǎn)單來說(?)就是利用普朗克黑體輻射定律,從溫度求出黑體輻射體所發(fā)出的光譜,再?gòu)墓庾V求出人眼所看到的顏色。
光線的發(fā)出和儲(chǔ)存都搞定了,接著該搞定曝光。這部分簡(jiǎn)單許多,計(jì)算可以直接套用公式,公式與其推導(dǎo)過程可見wiki或寒霜文件,寒霜使用的方法是Saturation-based speed。光線經(jīng)過曝光計(jì)算後,大部分會(huì)被壓縮到0~1區(qū)間。在這裡應(yīng)該再要加上一道查表步驟,模擬底片的特性,不過我還沒找到作法,只能先切掉大於1的部分,當(dāng)作過度曝光。最後一步是做gamma校正(RGB轉(zhuǎn)sRGB),因?yàn)間amma曲線其實(shí)不是很平滑,寒霜推薦轉(zhuǎn)換sRGB的演算法採(cǎi)用精確版本,而非以往的近似版本,接近黑色的顏色才會(huì)比較準(zhǔn)確。
因?yàn)闆]有準(zhǔn)備光度單位的environment map,因此測(cè)試用場(chǎng)景只在角落放了四個(gè)點(diǎn)光源:
▲光圈 f/1.4, 快門 0.1s, ISO400, 色溫5000K, 1500流明
▲加上color grading以模擬底片特性
該做的還有很多,找到更好的底片特性模擬法、用ray-tracing驗(yàn)證光線演算法是否正確、生出IBL用的cube map,如果Vulkan出的話還要開始移植。說到Vulkan,Nvidia似乎差不多準(zhǔn)備好了,還不出嗎?