最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

2019-12-7 Unity Shader 陰影

2019-12-10 00:09 作者:winter_mute  | 我要投稿

在實(shí)時(shí)渲染中,最常使用的是Shadow Map技術(shù),它會(huì)首先把攝像機(jī)的位置放在和光源重合的地方,場景中該光源的陰影區(qū)域就是那些攝像機(jī)看不到的地方。

而在前向渲染中,如果場景中平行光開啟了陰影,Unity就會(huì)為該光源計(jì)算它的陰影映射紋理(shadowmap),這張陰影映射紋理的本質(zhì)就是一張深度圖,它記錄了從該光源的位置出發(fā),能看到的場景中距離它最近的表面位置(深度信息)

在Unity Shader中實(shí)現(xiàn)時(shí),需要選擇一個(gè)額外的Pass來專門更新光源的陰影映射紋理,這個(gè)Pass的LightMode標(biāo)簽被設(shè)為ShadowCaster,這個(gè)Pass的目標(biāo)不是幀緩存,而是陰影映射紋理。

而如果沒有ShadowCaster的話,Unity會(huì)自動(dòng)按Fallback指定的Unity Shader中尋找到LightMode為Shadow Caster的Pass。如果還是沒有的話則該物體就無法向其他物體投射陰影。



首先 調(diào)用LightMode為ShadowCaster的Pass(即陰影Pass)來得到可投影陰影的 光源陰影映射紋理 以及 攝像機(jī)的深度紋理。

然后根據(jù) 光源陰影紋理 與 攝像機(jī)的深度紋理 得到 屏幕空間的陰影圖

如果 攝相機(jī)的深度圖 中記錄的表面深度大于轉(zhuǎn)換到 陰影紋理映射紋理 中的深度值,就表明該表面雖然可見,但卻處于該光源的陰影之中。

通過這樣的方式,陰影圖中就包含了屏幕空間中所有有陰影的區(qū)域。

如果我們想得到一個(gè)物體接收來自其他物體的投影,只需要在Shader中對 陰影圖 進(jìn)行采樣。

由于 陰影圖 是 屏幕空間 下的,因此需要吧表面坐標(biāo)從 模型空間 轉(zhuǎn)換到 屏幕空間 中,然后使用這個(gè)坐標(biāo)對 陰影圖 進(jìn)行采樣即可。


總結(jié)一下,一個(gè)物體接受來自其他物體的投影,以及它向其他物體投射陰影,這是兩個(gè)過程。


????如果我們想要一個(gè)物體接受來自其他物體的陰影,那就必須在Shader中對 陰影映射紋理(包括屏幕空間下的陰影圖) 進(jìn)行采樣,把采樣的結(jié)果

? ? 與最后的光照結(jié)果相乘得到陰影結(jié)果。

? ? 如果我沒想要一個(gè)物體向其他物體投射陰影,就必須把該物體加入到光源的 陰影映射紋理 的計(jì)算中,從而讓其他物體在對陰影映射紋理采樣時(shí)

????可以得到該物體的相關(guān)信息。


實(shí)踐



Cast Shadows的選項(xiàng)有4個(gè),分別是On, Off, TwoSided, Shadow Only,分別代表了開啟,關(guān)閉,允許對物體的所有面計(jì)算陰影信息,只計(jì)算陰影信息。這整個(gè)過程都是通過LightMode設(shè)置為ShadowCaster的Pass來實(shí)現(xiàn)的。

下面的Receive Shadows則是設(shè)置是否讓該物體接收來自其他物體的陰影。


讓物體接收陰影

1. 首先需要在Base Pass中包含新的內(nèi)置文件 #include "AutoLight.cginc"



這是因?yàn)橛?jì)算陰影的所有宏都是在這個(gè)文件里聲明的。

2. 在v2f里添加一個(gè)內(nèi)置宏SHDOW_COORDS(2)



它的作用是聲明一個(gè)用于對陰影紋理采樣的坐標(biāo)。這個(gè)宏的參數(shù)需要是下一個(gè)可用插值寄存器的索引值,本例中是2。

3. 在頂點(diǎn)著色器vert返回前添加一個(gè)內(nèi)置宏TRANSFER_SHADOW




這個(gè)宏用來在頂點(diǎn)著色器中計(jì)算上一步中聲明的陰影紋理坐標(biāo)。

4. 在片元著色器frag中計(jì)算陰影值,使用了內(nèi)置宏SHADOW_ATTENUATION



以上三個(gè)內(nèi)置宏(SHADOW_COORDS, TRANSFER_SHADOW, SHADOW_ATTENUATION) 就是計(jì)算陰影的三個(gè)主要部分??梢栽贏utoLight。cginc中找到它們的聲明。

SHADOW_COORDS 聲明了一個(gè)名為_ShadowCoord的陰影紋理坐標(biāo)變量。

TRANSFER_SHADOW 會(huì)根據(jù)平臺的不同而有所差異,如果當(dāng)前平臺可以使用屏幕空間的陰影映射技術(shù)(SCREENSPACE_SHADOWS),則會(huì)調(diào)用內(nèi)置的ComputeScreenPos函數(shù)計(jì)算_ShadowCoord; 如果不支持則會(huì)使用傳統(tǒng)的陰影映射技術(shù),TRANSFER_SHADOW會(huì)把頂點(diǎn)坐標(biāo)從模型空間轉(zhuǎn)換到光源空間后存儲(chǔ)到_ShadowCoord中。

SHADOW_ATTENUATION 負(fù)責(zé)使用_ShadowCoord對對應(yīng)的紋理進(jìn)行采,得到陰影信息。

由于這些宏會(huì)使用上下文的變量進(jìn)行計(jì)算,所以在命名變量時(shí)要保證與宏中使用的變量名相匹配,所以在a2v結(jié)構(gòu)體中的頂點(diǎn)坐標(biāo)變量必須為vertex,frag中的輸入結(jié)構(gòu)體a2v必須為v,且v2f中的頂點(diǎn)位置變量必須命名為pos。








2019-12-7 Unity Shader 陰影的評論 (共 條)

分享到微博請遵守國家法律
陈巴尔虎旗| 北海市| 高陵县| 晋江市| 仁寿县| 莎车县| 元氏县| 进贤县| 始兴县| 蕉岭县| 毕节市| 志丹县| 石景山区| 阿拉善右旗| 大理市| 台北市| 棋牌| 乌恰县| 稷山县| 塘沽区| 阿克苏市| 镇安县| 泸定县| 谢通门县| 从江县| 丰都县| 郓城县| 龙井市| 中超| 鄯善县| 永昌县| 博罗县| 绥宁县| 柘荣县| 保亭| 璧山县| 密山市| 剑川县| 灵川县| 山西省| 渝中区|