聊聊LightProbe原理實現(xiàn)以及對LightProbe數(shù)據(jù)的修改

merge_from_ofoct-9.png

0x00 前言

最近工作比較忙子姜,所以文章已經(jīng)很久沒有更新了。這篇小文的主題也是在出差的高鐵上想到驯鳖,因為最近和一些朋友聊天闲询,發(fā)現(xiàn)他們中很多人的項目中都使用了多個實時光源。細(xì)問之下主要是某些物體浅辙,例如角色扭弧,在烘焙后的場景中顯得不夠突出,為了突出角色所以加入了更多的實時光源记舆。但事實上這可能并非一個很好的選擇鸽捻。

0x01 間接光還是直接光

下面這張圖片演示了只有直接光照以及加上了間接光照之后的對比。


GI_comparison_1.png

可以看到泽腮,直接光照抵達不到的地方的黑暗的部分要通過間接光照來照亮御蒲,而不是為了提高暗部的亮度再加一盞實時燈光。
事實上诊赊,如果場景中有大量的燈光——例如如果在上圖中為室內(nèi)增加大量補光來提高室內(nèi)亮度——
還會造成場景中的明暗對比降低厚满,畫面顯得更“平”。
這也是很多朋友的項目中場景中存在的一個比較常見的問題碧磅,即亮度不夠燈光補碘箍。補著補著才發(fā)現(xiàn),整個場景已經(jīng)充斥了太多的燈光了鲸郊,而場景也因此整體很亮丰榴,沒有了明暗對比,結(jié)果就是視覺效果平的不真實秆撮。
相信各位也一定想到了四濒,亮度不夠燈光補這個思路的另一個實踐——場景內(nèi)的角色不夠亮?xí)r也選擇使用一個燈光來給角色補光——同樣存在著和之前所說的一樣的問題。
那么怎么提亮角色才更加合理一些呢职辨?(雖然提亮角色這件事本身就不符合物理規(guī)則盗蟆,但是為了游戲效果顯然存在這樣的需求)。如上圖所示那樣拨匆,利用間接光來照亮物體是一個不錯的思路姆涩,不夠亮?提高間接光的亮度惭每。
在Unity中如何給動態(tài)物體提供間接光?這就引出了下面的主角——LightProbe。

0x02 LightProbe的核心

LightProbe主要解決了如何在動態(tài)對象和角色上使用烘焙的照明信息台腥。
其實LightProbe的核心就是球面亮度信號編碼和重建宏赘。


Light-Probe-Interpolation-Using-Tetrahedral

如果大家了解信號處理方面的知識的話,就會知道只要信號滿足一定條件黎侈,就可以分解為一系列正弦諧波的和察署,諧波頻率以倍頻增長,這就是所謂的傅立葉級數(shù)峻汉。
而lightprobe也采用了類似的思路贴汪,使用了球諧函數(shù)來對該球面上的亮度信號進行編碼。

同樣的休吠,一個原始的亮度信號也可以分解為一系列帶縮放參數(shù)的基函數(shù)之和扳埂,而我們只需要知道這些基函數(shù)的縮放系數(shù)就可以在運行時快速的重建原始的亮度信號了。


Spherical_Harmonics.png

但是有一個問題瘤礁,那就是如果要完美的重建原始光照信號的話阳懂,顯然需要很多很多甚至是無窮項球諧函數(shù)。但是好在LightProbe中保存的主要是一些低頻的光照信息柜思,換句話說岩调,它沒有高頻率變化,所以如果我們通過丟棄所有更高的頻率來壓縮球體上的頻域數(shù)據(jù)赡盘,沒有人會注意到号枕。所以這里我們可以只取有限的低頻諧函數(shù)。

在Unity中陨享,烘焙GI的LightProbe采用了3階球諧函數(shù)(9個參數(shù))葱淳,實時GI中的LightProbe采用了2階球諧函數(shù)(4個參數(shù))。
OK,信號編碼的問題解決了,另一個問題即在運行時如何重建亮度信號否副。其實使用lightprobe的開銷很低噩茄,因為只需要將縮放系數(shù)與其對應(yīng)的基函數(shù)相乘之后再求和的結(jié)果就是近似的原始信號。

接下來我來看看一個Unity中的LightProbe中保存了哪些數(shù)據(jù)吧觅玻。


屏幕快照 2018-04-20 下午12.23.56.png

在Unity中,我們可以使用腳本將場景內(nèi)的LightProbe保存為一個Asset,并且只要保證使用文本格式進行序列化唁毒,我們就可以直接查看其數(shù)據(jù)內(nèi)容了。

AssetDatabase.CreateAsset(Instantiate(LightmapSettings.lightProbes), "Assets/lightProbe.asset");

首先能夠注意到的是“m_Tetrahedra”部分星爪。


屏幕快照 2018-04-21 上午9.27.39.png

這個其實就是在運行時LightProbe插值時需要用到的四面體數(shù)據(jù)浆西。因為如果要進行插值,顯然要知道需要哪幾個點來插值顽腾,同時還需要知道每個點的權(quán)重各是多少近零。
在Unity中會根據(jù)角色所在的位置诺核,選擇四面體,然后使用組成四面體的點進行插值久信,當(dāng)然還可以確定每個點的權(quán)重窖杀。


屏幕快照 2018-04-21 上午9.34.55.png

在靠后的位置,我們還可以找到烘焙后的球諧函數(shù)的系數(shù)裙士。


屏幕快照 2018-04-21 上午9.48.20.png

可以看到9個參數(shù)3個通道所以每一個點總共有27個float數(shù)據(jù)入客。
綜上,可以看到在使用LightProbe時腿椎,計算開銷并不大桌硫,相對來說比較大的開銷主要來自對內(nèi)存的占用。

0x03 修改LightProbe數(shù)據(jù) 提亮角色

ok啃炸,簡單介紹了一下LightProbe的原理以及實現(xiàn)铆隘。下面我們還是回到最初的問題,那么怎么提亮一個場景內(nèi)的角色才更加合理一些呢肮帐?
事實上我們可以通過修改烘焙后的LightProbe的數(shù)據(jù)來實現(xiàn)這樣的需求咖驮。


light1.png

可以看到上圖中,角色已經(jīng)和場景融為了一體训枢。雖然這樣更加真實和符合物理規(guī)則托修,但是我想對很多人來說這顯然不是一個好的效果。角色還是能更加突出的好恒界。
好在Unity提供了獲取烘焙后的LightProbe數(shù)據(jù)的接口:

  var probes = LightmapSettings.lightProbes.bakedProbes;

bakedProbes內(nèi)保存的是一堆“SphericalHarmonicsL2”對象睦刃,只要修改SphericalHarmonicsL2的縮放比例就可以修改LightProbe所提供的亮度了。
除了修改亮度之外十酣,有時我們也會想讓角色有不同的環(huán)境光效果涩拙,以更加突出角色。這時我們就可以通過SphericalHarmonicsL2中定義的AddAmbientLight方法來實現(xiàn)了:

  probe.AddAmbientLight(color);

提亮和修改環(huán)境色之后耸采,我們的角色在場景中就成了下面這樣兴泥。比實時光更加自然和開銷更低。


light2.png

當(dāng)然虾宇,這里只是拋磚引玉搓彻,歡迎大家來討論。
相關(guān)的腳本嘱朽,可以在這里獲刃癖帷:
https://github.com/chenjd/LightProbeEditor

ref:

https://en.wikipedia.org/wiki/Delaunay_triangulation
https://www.gdcvault.com/play/1015312/Light-Probe-Interpolation-Using-Tetrahedral
https://en.wikipedia.org/wiki/Spherical_harmonics

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市搪泳,隨后出現(xiàn)的幾起案子稀轨,更是在濱河造成了極大的恐慌,老刑警劉巖岸军,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋刽,死亡現(xiàn)場離奇詭異瓦侮,居然都是意外死亡,警方通過查閱死者的電腦和手機杨名,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門脏榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猖毫,“玉大人台谍,你說我怎么就攤上這事∮醵希” “怎么了趁蕊?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仔役。 經(jīng)常有香客問我掷伙,道長,這世上最難降的妖魔是什么又兵? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任任柜,我火速辦了婚禮,結(jié)果婚禮上沛厨,老公的妹妹穿的比我還像新娘宙地。我一直安慰自己,他們只是感情好逆皮,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布宅粥。 她就那樣靜靜地躺著,像睡著了一般电谣。 火紅的嫁衣襯著肌膚如雪秽梅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天剿牺,我揣著相機與錄音企垦,去河邊找鬼。 笑死晒来,一個胖子當(dāng)著我的面吹牛钞诡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潜索,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臭增,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竹习?” 一聲冷哼從身側(cè)響起誊抛,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎整陌,沒想到半個月后拗窃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞎领,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年随夸,在試婚紗的時候發(fā)現(xiàn)自己被綠了九默。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宾毒,死狀恐怖驼修,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诈铛,我是刑警寧澤乙各,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站幢竹,受9級特大地震影響耳峦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焕毫,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一蹲坷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邑飒,春花似錦循签、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罕扎,卻和暖如春聚唐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腔召。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工杆查, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人臀蛛。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓亲桦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浊仆。 傳聞我的和親對象是個殘疾皇子客峭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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