ETH官方钱包

切換
舊版
前往
大廳
主題

Tone mapping之camera模擬

Lumi | 2015-11-07 12:29:09 | 巴幣 0 | 人氣 358


▲模擬被燈泡照明的米卡莎
光圈 f/1.4, 快門 0.1s, ISO400, 光源色溫2700K, 730流明

這回的目標(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)備好了,還不出嗎?

創(chuàng)作回應(yīng)

更多創(chuàng)作