球諧光照

環(huán)境貼圖最主要的技術(shù)實(shí)現(xiàn)方式有三種:立方體貼圖、IBL和球諧光照迟蜜。

之前已經(jīng)說過立方體貼圖和IBL谢肾,今天重點(diǎn)來(lái)聊一聊球諧光照。

在立方體貼圖IBL的基本設(shè)置里小泉,Convolution Type屬性 除了設(shè)置為Specular(Glossy Reflection)之外芦疏,還可以設(shè)置為Diffuse(Irradiance)。Specular 是IBL用于模擬間接光照高光反射的微姊,而Diffuse是模擬間接光照漫反射的酸茴。

間接光照漫反射(下文只稱漫反射)的實(shí)現(xiàn)方式有兩種:一種是IBL,另外一種就是球諧光照兢交。先來(lái)看看IBL實(shí)現(xiàn)漫反射的方式薪捍。

IBL漫反射

漫反射區(qū)別于高光反射,它的顏色變化不會(huì)隨視角的轉(zhuǎn)動(dòng)而發(fā)生變化,使用IBL實(shí)現(xiàn)漫反射酪穿,首先要將Convolution Type屬性設(shè)置為Diffuse(Irradiance)凳干。

高光反射的顏色會(huì)隨著視角的變化而變化,而漫反射不會(huì)被济,在計(jì)算顏色時(shí)只和法線方向有關(guān)救赐,因此,IBL漫反射的計(jì)算公式是

// 漫反射顏色的計(jì)算
float4 uv_ibl = float4(normal_dir, mip_level);
half4 color_cubemap = texCUBElod(_CubeMap, uv_ibl);
half3 env_color = DecodeHDR(color_cubemap, _CubeMap_HDR);

大家可以對(duì)比一下IBL高光反射計(jì)算的方式只磷,看看二者的區(qū)別:

half4 colorCubeMap = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0,reflect_dir,mip_Level);
half3 env_color = DecodeHDR(colorCubeMap,unity_SpecCube0_HDR);

在貼圖尺寸設(shè)置上经磅,如果只是用來(lái)實(shí)現(xiàn)漫反射效果,貼圖的尺寸不需要太大钮追,一般設(shè)置512*512就足夠了预厌。

漫反射效果,忽略AO元媚,物體各處的光照強(qiáng)度基本一致轧叽,沒有太多的強(qiáng)弱之分,在視覺上也呈現(xiàn)出溫和的效果刊棕。

球諧光照

球諧光照最主要的應(yīng)用就是用于計(jì)算間接光照(也叫環(huán)境光)犹芹,這里的間接光照是指skybox所發(fā)出的光。

IBL也是計(jì)算間接光照鞠绰,skybox發(fā)出的環(huán)境光有什么特點(diǎn)呢?它最大的特點(diǎn)skybox無(wú)限大飒焦,如此一來(lái)我們可以忽略掉位置信息而只考慮法線信息蜈膨。也就是說,不管我們的模型多么大牺荠,在計(jì)算模型上某一個(gè)具體點(diǎn)的時(shí)候我們認(rèn)為該點(diǎn)處于天空球中心翁巍。

不過IBL計(jì)算間接光照最大的缺點(diǎn)就是紋理采樣。采用IBL的方法休雌,我們需要存儲(chǔ)一張立方體貼圖灶壶,紋理采樣的帶寬對(duì)于電腦來(lái)說可能不算什么,不過對(duì)于手機(jī)而言就實(shí)在是有點(diǎn)奢侈了杈曲。

球諧光照可以說是為了彌補(bǔ)IBL的缺點(diǎn)而誕生的一種更加性能優(yōu)化的計(jì)算方式驰凛。

這里不探討球諧光照是如何實(shí)現(xiàn)的,因?yàn)槠渲猩婕暗臄?shù)學(xué)模型計(jì)算實(shí)在是太復(fù)雜了担扑。我們只關(guān)注在unity中如何實(shí)現(xiàn)球諧光照恰响。

我們先要明白球諧光照的一個(gè)最基本原理,它是通過從立方體貼圖中計(jì)算提取出七個(gè)球諧光照系數(shù)涌献,然后通過一些復(fù)雜的數(shù)學(xué)計(jì)算生成光照顏色胚宦,最后賦予給物體。

這些系數(shù)的格式如下所示,僅供參考:

獲取到這些系數(shù)后枢劝,然后把它傳遞到shader里面參與計(jì)算井联,計(jì)算的核心代碼如下所示:


    float4 normalForSH = float4(normal_dir, 1.0);
    //SHEvalLinearL0L1
    half3 x;
    x.r = dot(custom_SHAr, normalForSH);
    x.g = dot(custom_SHAg, normalForSH);
    x.b = dot(custom_SHAb, normalForSH);

    //SHEvalLinearL2
    half3 x1, x2;
    // 4 of the quadratic (L2) polynomials
    half4 vB = normalForSH.xyzz * normalForSH.yzzx;
    x1.r = dot(custom_SHBr, vB);
    x1.g = dot(custom_SHBg, vB);
    x1.b = dot(custom_SHBb, vB);

    // Final (5th) quadratic (L2) polynomial
    half vC = normalForSH.x*normalForSH.x - normalForSH.y*normalForSH.y;
    x2 = custom_SHC.rgb * vC;

    float3 sh = max(float3(0.0, 0.0, 0.0), (x + x1 + x2));
    sh = pow(sh, 1.0 / 2.2);

    half3 env_color = sh;

光照探針

掌握了了球諧光照的基本原理,我們?cè)賮?lái)說說光照探針您旁。

球諧光照是光照探針的使用基礎(chǔ)烙常,如果手動(dòng)實(shí)現(xiàn)球諧光照,就要像上面一樣又是計(jì)算光照系數(shù)被冒,又是引入立方體貼圖军掂,還要在shader中進(jìn)行大量復(fù)雜的計(jì)算。這無(wú)疑非常困難昨悼。

但unity已經(jīng)給開發(fā)者封裝好了這一系列操作蝗锥,它就是光照探針!我們來(lái)看看光照探針是如何使用的率触。

全局光照探針

如果場(chǎng)景中沒有放置光照探針终议,unity會(huì)默認(rèn)使用一個(gè)全局光照探針,它是在Lightint面板中設(shè)置的葱蝗。

不過穴张,在此之前要先烘焙立方體貼圖,這和使用反射探針的操作是一樣的两曼。

Environment Light是設(shè)置光照探針烘焙貼圖的相關(guān)屬性

Environment Reflections是設(shè)置反射探針烘焙貼圖的相關(guān)屬性

設(shè)置完成后皂甘,點(diǎn)擊Generate Lighting按鈕,就會(huì)在場(chǎng)景Scene文件夾下生成一張帶有光照信息的立方體貼圖悼凑。

第二歩偿枕、漫反射的計(jì)算。球諧光照的shader計(jì)算很復(fù)雜户辫,但是使用unity內(nèi)置的球諧光照計(jì)算方法ShadeSH9()渐夸,計(jì)算就會(huì)變得非常簡(jiǎn)單,不過在此之前渔欢,還需要設(shè)置LightMode墓塌、引入相關(guān)文件,具體如下:


Tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma multi_compile_fwdbase
#include "AutoLight.cginc"
#include "UnityCG.cginc"
half3 env_color = ShadeSH9(float4(normal_dir,1.0));

打開Frame Debugger,在渲染流程中可以查看到球諧光照的系數(shù)信息

手動(dòng)計(jì)算球諧光照奥额,需要開發(fā)者自己在參數(shù)面板上設(shè)置球諧系數(shù)值苫幢,這些系數(shù)值的計(jì)算是一個(gè)非常復(fù)雜的過程,往往需要借助一些第三方工具垫挨。而使用全局光照探針和unity內(nèi)置的球諧光照計(jì)算的函數(shù)态坦,就免去了上述一系列復(fù)雜的操作。

對(duì)比一下手動(dòng)計(jì)算球諧光照和使用光照探針計(jì)算球諧光照的效果棒拂,二者之間沒有太大的差別伞梯。

局部光照探針

局部光照探針需要開發(fā)者手動(dòng)添加玫氢,我們來(lái)看看該如何操作?

1谜诫、添加LightProbeGroup

2漾峡、進(jìn)入edit 模式,排列布置探針小球的采樣點(diǎn)位置

3喻旷、添加光源生逸,光源模式設(shè)置為Baked

4、在Lighting面板中勾選“Baked Global Illumination”且预,然后點(diǎn)擊“Generate Lighting”

5送丰、最后看看效果瘪菌,當(dāng)物體移動(dòng)時(shí)名党,物體表面的光照也會(huì)時(shí)刻發(fā)生變化帝际。

為什么會(huì)這樣呢?這是因?yàn)楹姹嘿N圖后涮拗,光照探針組的每一個(gè)光照小球乾戏,都帶有球諧值。我們可以通過下面的設(shè)置三热,直接查看光照小球的信息鼓择。

點(diǎn)擊物體模型,帶線條的小球就是對(duì)物體光照產(chǎn)生影響的光照探針就漾。當(dāng)物體移動(dòng)時(shí)呐能,它附近的光照小球可以將攜帶的球諧信息進(jìn)行插值混合運(yùn)算,生成新的球諧系數(shù)抑堡,最后再賦予給物體的shader摆出,從而照亮物體。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夷野,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荣倾,更是在濱河造成了極大的恐慌悯搔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舌仍,死亡現(xiàn)場(chǎng)離奇詭異妒貌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铸豁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門灌曙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人节芥,你說我怎么就攤上這事在刺∧婧Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵蚣驼,是天一觀的道長(zhǎng)魄幕。 經(jīng)常有香客問我,道長(zhǎng)颖杏,這世上最難降的妖魔是什么纯陨? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮留储,結(jié)果婚禮上翼抠,老公的妹妹穿的比我還像新娘。我一直安慰自己获讳,他們只是感情好阴颖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赔嚎,像睡著了一般膘盖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尤误,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天侠畔,我揣著相機(jī)與錄音,去河邊找鬼损晤。 笑死软棺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尤勋。 我是一名探鬼主播喘落,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼最冰!你這毒婦竟也來(lái)了瘦棋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暖哨,失蹤者是張志新(化名)和其女友劉穎赌朋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篇裁,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沛慢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了达布。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片团甲。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖黍聂,靈堂內(nèi)的尸體忽然破棺而出躺苦,到底是詐尸還是另有隱情身腻,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布圾另,位于F島的核電站霸株,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏集乔。R本人自食惡果不足惜去件,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扰路。 院中可真熱鬧尤溜,春花似錦、人聲如沸汗唱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哩罪。三九已至授霸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間际插,已是汗流浹背碘耳。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留框弛,地道東北人辛辨。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瑟枫,于是被迫代替她去往敵國(guó)和親斗搞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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