高動(dòng)態(tài)范圍光照(High Dynamic Range Imaging症见,簡(jiǎn)稱HDRI或HDR)

1 HDR基本概念

  高動(dòng)態(tài)范圍光照(High Dynamic Range Imaging路鹰,簡(jiǎn)稱HDRI或HDR),是一種表達(dá)超過(guò)了顯示器所能表現(xiàn)的亮度范圍的圖像映射技術(shù)盏筐,已成為目前游戲應(yīng)用不可或缺的一部分围俘。通常砸讳,顯示器能夠顯示R琢融、G、B分量在[0, 255]之間的像素值簿寂。而256個(gè)不同的亮度級(jí)別顯然不能表示自然界中光線的亮度情況漾抬。比如,太陽(yáng)的亮度可能是一個(gè)白熾燈亮度的幾千倍常遂,是一個(gè)被白熾燈照亮的桌面的亮度的幾十萬(wàn)倍纳令,這遠(yuǎn)遠(yuǎn)超出了顯示器的亮度表示能力。

想象在一個(gè)房間中克胳,刺眼的陽(yáng)光從窗外照進(jìn)來(lái)平绩,若使用常規(guī)方法渲染這個(gè)房間,房間中白色的墻壁的顏色是(255, 255, 255)漠另,陽(yáng)光的顏色也是(255, 255, 255)捏雌,墻壁將表現(xiàn)得和窗外的陽(yáng)光顏色一樣。很明顯笆搓,這和我們現(xiàn)實(shí)看到的差異很大性湿,現(xiàn)實(shí)場(chǎng)景中陽(yáng)光要比墻壁刺眼很多纬傲,我們需要使用某種技術(shù)對(duì)陽(yáng)光的亮度和墻壁的亮度進(jìn)行處理,讓其在顯示器上的效果接近現(xiàn)實(shí)效果肤频。

簡(jiǎn)單的將高范圍的亮度按比例縮放后映射到[0, 255]是不可行的叹括,比如將[0, 511]的范圍按照2:1映射到[0, 255],雖然表示的亮度范圍擴(kuò)大了宵荒,但是將導(dǎo)致色帶(Color Banding)問(wèn)題汁雷,色帶如圖1所示。

image
image

圖1 左圖有色帶問(wèn)題骇扇,右圖顯示正常

在有限的亮度范圍內(nèi)顯示自然界中相當(dāng)寬廣的亮度范圍摔竿,正是HDR技術(shù)所要解決的問(wèn)題。

2 HDR渲染步驟

1)將整個(gè)場(chǎng)景渲染到一張浮點(diǎn)紋理上(16bit或32bit都可以)少孝;

2)色調(diào)映射(Tone Mapping)继低;

3)渲染泛光(Bloom)效果;

4)將泛光和色調(diào)映射的結(jié)果進(jìn)行疊加稍走。

第一步很簡(jiǎn)單袁翁,只需要硬件支持浮點(diǎn)紋理即可,比較重要的是本文重點(diǎn)介紹的2婿脸、3兩步粱胜,最后將2、3兩步的結(jié)果進(jìn)行疊加狐树,形成最終效果圖焙压。

【顯示設(shè)備上[0, 255]的亮度范圍在著色器程序中使用[0, 1]的浮點(diǎn)數(shù)表示,下文的亮度和顏色值表示均使用著色器程序的標(biāo)準(zhǔn)抑钟。在算法中都用到了亮度的計(jì)算涯曲,每個(gè)像素的亮度的計(jì)算方法是L=0.27R+0.62G+0.06B】

3 色調(diào)映射

色調(diào)映射是在有限動(dòng)態(tài)范圍媒介上近似顯示高動(dòng)態(tài)范圍圖像的技術(shù)。對(duì)于人眼來(lái)說(shuō)也有類似的映射方式在塔,因?yàn)槿搜蹖?duì)亮度的感知范圍遠(yuǎn)低于自然界的亮度范圍幻件,只能感知到某個(gè)范圍內(nèi)的光照。和顯示設(shè)備不同的是蛔溃,人眼對(duì)光的感知范圍是動(dòng)態(tài)變化的绰沥,例如從光亮的室外環(huán)境突然走入一個(gè)黑暗的室內(nèi)環(huán)境,剛剛開(kāi)始一片漆黑贺待,過(guò)一會(huì)兒才可以看清周圍環(huán)境徽曲,人眼的這個(gè)調(diào)節(jié)過(guò)程叫做光適應(yīng)(Light Adaptation)。所以要模擬出真實(shí)的光照效果麸塞,除了表現(xiàn)出合適的光照秃臣,還需要模擬出人眼對(duì)光線的調(diào)節(jié)過(guò)程。

最簡(jiǎn)單的色調(diào)映射是將亮度超過(guò)1的值置為1喘垂,這種做法會(huì)出現(xiàn)文章開(kāi)始提到的墻壁和陽(yáng)光一樣亮的問(wèn)題甜刻;另一種簡(jiǎn)單的色調(diào)映射是將每個(gè)像素的除以最高亮度像素的亮度值绍撞,可以很好的將所有像素的亮度映射到[0, 1]之間,這種方法會(huì)導(dǎo)致場(chǎng)景中某些特別亮的像素會(huì)導(dǎo)致場(chǎng)景中的其他部分特別暗得院。比較好的方式是采用平均亮度值進(jìn)行調(diào)節(jié)傻铣,由于平均亮度值反映了場(chǎng)景中的整體亮度,所以受到場(chǎng)景中少部分過(guò)亮或過(guò)暗的像素影響不大祥绞。

3.1 計(jì)算平均亮度

計(jì)算平均亮度的公式為:

image

該公式先對(duì)亮度取對(duì)數(shù)非洲,平均后再進(jìn)行冪運(yùn)算。之所以不是直接對(duì)亮度平均蜕径,而是取了對(duì)數(shù)两踏,是為了防止過(guò)亮的像素對(duì)整體造成的影響過(guò)大,該公式來(lái)源于參考文獻(xiàn)1兜喻。

計(jì)算平均亮度的最簡(jiǎn)單的方法是遍歷所有像素梦染,用上述公式求平均值。該方法需要CPU完成朴皆,效率不高帕识,DirectX的“HDRLighting”例子采用了一種基于GPU加速的方法,利用像素著色器多次DownSampling遂铡,最后求得平均值肮疗,具體流程如下:

1)首先將場(chǎng)景渲染到紋理中,在此基礎(chǔ)上扒接,對(duì)該紋理取樣并計(jì)算相應(yīng)像素亮度的ln()值并進(jìn)行平均(相當(dāng)于上述公式去掉exp)伪货,存入64*64的紋理中;

2)對(duì)上一步的紋理44 DownSampling钾怔,生成1616的紋理碱呼;

3)對(duì)上一步的紋理44 DownSampling,生成44的紋理蒂教;

4)對(duì)上一步的紋理44 DownSampling巍举,生成11的紋理脆荷,并計(jì)算其exp()值凝垛。

最后生成的11的紋理中的像素為公式中要求的平均亮度Lavg。*

3.2 光適應(yīng)

為了模擬人眼對(duì)于不同光強(qiáng)會(huì)自動(dòng)調(diào)節(jié)適應(yīng)范圍的效果蜓谋,只需要對(duì)這一幀求出的平均亮度Lavg與上一幀的平均亮度Lavg進(jìn)行插值即可梦皮,當(dāng)然這個(gè)插值不是線性插值,“HDRLighting”中的代碼如下:

|

1

|

float fNewAdaptation = fAdaptedLum + (fCurrentLum - fAdaptedLum) * ( 1 - ``pow``( 0.98f, 30 * g_fElapsedTime ) );

|

其中桃焕,fAdaptedLum為上一幀的Lavg剑肯,fCurrentLum為當(dāng)前幀的Lavg,g_fElapsedTime為當(dāng)前幀和上一幀的時(shí)間間隔观堂,fNewAdaptation為最終Lavg的計(jì)算結(jié)果让网。

3.3 計(jì)算縮放因子

場(chǎng)景的整體亮度可以通過(guò)縮放因子進(jìn)行調(diào)節(jié)呀忧,公式如下:

image

其中Lscale(x,y)是當(dāng)前像素的亮度值。Key是一個(gè)常數(shù)溃睹,Key 的大小決定了映射后場(chǎng)景的整體明暗程度而账,一般取0.18(在伽馬校正理論中,0.18經(jīng)過(guò)校正后大概是0.5因篇,也就是我們感官上的中等灰度級(jí))泞辐。Key值的選擇可以看作攝像機(jī)的曝光程度,我們可以使用這個(gè)公式控制自由的攝像機(jī)的曝光程度竞滓,Key越大整個(gè)場(chǎng)景就顯得越白咐吼。一般來(lái)說(shuō),高曝光的Key最高為0.72商佑,低曝光的Key最低為0.045锯茄,一般程度的曝光Key選擇0.18附近的值。

3.4 歸一化處理

到此為止茶没,色調(diào)映射已經(jīng)基本完成撇吞,剩下的只需要將Lscale(x,y)映射到[0, 1]范圍內(nèi)即可,公式如下:

image

其中其中Color(x,y)是當(dāng)前像素的顏色值礁叔。

4 渲染泛光效果

泛光是一種光學(xué)效應(yīng)牍颈,它是指在來(lái)自于強(qiáng)光源的光線看起來(lái)像是影響到了周圍物體。想象一間房間琅关,窗戶外面陽(yáng)光明媚煮岁,若往窗外看去,感覺(jué)窗戶光亮的邊緣有一圈模糊涣易,這就是泛光效果画机。在游戲中適當(dāng)?shù)脑黾臃汗庑Ч軌蛟鰪?qiáng)畫(huà)面的真實(shí)感新症。

渲染泛光效果的思路很簡(jiǎn)單步氏,主要分為兩個(gè)步驟,第一步是使用bright-pass filter提取出場(chǎng)景中高亮部分徒爹,第二步對(duì)高亮部分進(jìn)行模糊處理荚醒。"HDRLighting"中bright-pass filter的代碼如下:

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px 0px 0px 22px; white-space: pre-wrap; overflow-wrap: break-word; font-size: 12px !important; font-family: "Courier New" !important;"> 1 // Determine what the pixel's value will be after tone mapping occurs
2 vSample.rgb *= g_fMiddleGray/(fAdaptedLum + 0.001f);
3
4 // Subtract out dark pixels
5 vSample.rgb -= BRIGHT_PASS_THRESHOLD; 6
7 // Clamp to 0
8 vSample = max(vSample, 0.0f);
9
10 // Map the resulting value into the 0 to 1 range. Higher values for 11 // BRIGHT_PASS_OFFSET will isolate lights from illuminated scene 12 // objects.
13 vSample.rgb /= (BRIGHT_PASS_OFFSET+vSample); </pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

第二步則是對(duì)第一步的結(jié)果進(jìn)行模糊,首先對(duì)第一步的結(jié)果進(jìn)行22或44的downsampling隆嗅,再使用2*2的高斯核心對(duì)其進(jìn)行模糊界阁。其中先對(duì)圖像downsampling再模糊的做法是利用GPU進(jìn)行圖像模糊的一種提高性能的方法,因?yàn)閐ownsampling后圖像分辨率降低了胖喳,計(jì)算量自然就少了泡躯;而downsampling后的圖片再放大,本身又是一種模糊,可以減少高斯模糊的采樣數(shù)量较剃。最終效果如圖2所示

image
image
image

圖2 圖片來(lái)源于微軟DirectX SDK中“HDRLighting”例子咕别,左圖為過(guò)度曝光的場(chǎng)景,中間圖片為bright-pass filter處理后的結(jié)果写穴,右圖為模糊之后的效果

5 融合

現(xiàn)在需要將色調(diào)映射的圖像與泛光的圖像進(jìn)行融合顷级。在融合操作中除了常見(jiàn)的α融合外,還有一種疊加(Additive Blending)操作确垫,它可以將兩種顏色的值進(jìn)行加法操作弓颈,通常會(huì)使得顏色越變?cè)桨祝@正是我們所要的效果删掀。將色調(diào)映射的圖像與泛光的圖像進(jìn)行疊加操作翔冀,即可生成最終圖像。

6披泪、最終效果

“HDRLighting”中LDR和HDR的效果對(duì)比如圖3所示纤子。

image
image

圖3 “HDRLighting”中LDR和HDR的效果對(duì)比,左圖為L(zhǎng)DR款票,右圖為HDR

其他的一些HDR渲染效果如圖4-7所示控硼。圖4中很明顯的觀察到汽車窗戶的鏡面光,圖5中藍(lán)色的燈光顯得比較亮艾少,但是暗的地方也很清晰卡乾;圖6和圖7來(lái)自游戲“孤島危機(jī)”,效果相當(dāng)不錯(cuò)缚够,其中就有HDR的功勞(當(dāng)然要做到這樣的畫(huà)質(zhì)幔妨,HDR只是冰山一角)。圖6場(chǎng)景明暗得當(dāng)谍椅,透過(guò)樹(shù)葉可以看到天空略微模糊误堡;圖7中可以看到爆炸產(chǎn)生的碎片以及車上的顯示屏有泛光效果,充分體現(xiàn)了亮度的差別雏吭,而這些細(xì)節(jié)讓游戲更加逼真锁施。

image

圖4 Unity3D文檔中的HDR渲染效果圖1

image

圖5 Unity3D文檔中的HDR渲染效果圖2

image

圖6 “孤島危機(jī)”截圖1

image

圖7 “孤島危機(jī)”截圖2

參考文獻(xiàn):

[1]Reinhard, Erik, Mike Stark, Peter Shirley, and James Ferwerda. "Photographic Tone Reproduction for Digital Images". ACM Transactions on Graphics (TOG), Proceedings of the 29th Annual Conference on Computer Graphics and Interactive Techniques (SIGGRAPH), pp. 267-276. New York, NY: ACM Press, 2002.

[2]Akenine-M?ller T, Haines E, Hoffman N. Real-time rendering 3 [M].

[3]DirectX 9.0c SDK

[4]http://www.cnblogs.com/cxrs/archive/2013/03/22/hdr%E9%AB%98%E5%8A%A8%E6%80%81%E8%8C%83%E5%9B%B4%E5%85%89%E7%85%A7%E6%B8%B2%E6%9F%93.html

[5]http://wenku.baidu.com/view/fe31607ea26925c52cc5bf97.html

[6]http://www.zwqxin.com/archives/shaderglsl/review-high-dynamic-range.html

[7]http://zh.wikipedia.org/wiki/%E9%AB%98%E5%8A%A8%E6%80%81%E8%8C%83%E5%9B%B4%E6%88%90%E5%83%8F

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杖们,隨后出現(xiàn)的幾起案子悉抵,更是在濱河造成了極大的恐慌,老刑警劉巖胀莹,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件基跑,死亡現(xiàn)場(chǎng)離奇詭異婚温,居然都是意外死亡描焰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荆秦,“玉大人篱竭,你說(shuō)我怎么就攤上這事〔匠瘢” “怎么了掺逼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓤介。 經(jīng)常有香客問(wèn)我吕喘,道長(zhǎng),這世上最難降的妖魔是什么刑桑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任氯质,我火速辦了婚禮,結(jié)果婚禮上祠斧,老公的妹妹穿的比我還像新娘闻察。我一直安慰自己,他們只是感情好琢锋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布辕漂。 她就那樣靜靜地躺著,像睡著了一般吴超。 火紅的嫁衣襯著肌膚如雪钉嘹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天鲸阻,我揣著相機(jī)與錄音隧期,去河邊找鬼。 笑死赘娄,一個(gè)胖子當(dāng)著我的面吹牛仆潮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遣臼,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼性置,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了揍堰?” 一聲冷哼從身側(cè)響起鹏浅,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屏歹,沒(méi)想到半個(gè)月后隐砸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝙眶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年季希,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褪那。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡式塌,死狀恐怖博敬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峰尝,我是刑警寧澤偏窝,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站武学,受9級(jí)特大地震影響祭往,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜火窒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沛鸵。 院中可真熱鬧括勺,春花似錦、人聲如沸曲掰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栏妖。三九已至乱豆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吊趾,已是汗流浹背宛裕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留论泛,地道東北人揩尸。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屁奏,于是被迫代替她去往敵國(guó)和親岩榆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容