URP | 物體陰影
實(shí)現(xiàn)思路
陰影
陰影分為接收陰影和投射陰影兩個(gè)部分,接收陰影開啟部分關(guān)鍵字就可以了,但是需要注意的是,計(jì)算燈光的時(shí)候需要把光的衰減計(jì)算進(jìn)去。
但投射陰影需要寫一個(gè)用與投射陰影的單獨(dú)一個(gè)Pass,該P(yáng)ass的渲染路徑采用ShadowCaster
第一個(gè)Pass,開啟一系列相關(guān)關(guān)鍵字,用于接收陰影
其中是否開啟軟陰影,需要在管線中設(shè)置


然后在片元著色器中使用TransformWorldToShadowCoord函數(shù)獲取陰影紋理坐標(biāo),使用該坐標(biāo)獲取主光源,再進(jìn)行一系列光源計(jì)算
第二個(gè)Pass參考URP的
**Universal Render Pipeline/Lit/ShadowCaster**
Pass創(chuàng)建生成陰影的Pass,主要任務(wù)在于將陰影從對(duì)象空間中轉(zhuǎn)換到裁剪空間。
實(shí)現(xiàn)
主光源 | 陰影
接受陰影
增加接受陰影關(guān)鍵字

關(guān)鍵字倆個(gè)橫線中間需要有空格,
注意: 如果開啟關(guān)鍵字,還是沒(méi)有效果,是在計(jì)算陰影的時(shí)候沒(méi)有增加衰減。
前在第一個(gè)pass里片元著色器計(jì)算光照的時(shí)候輸出

在計(jì)算漫反射的時(shí)候需要把光照衰減計(jì)算進(jìn)去。
mylight.shadowAttenuation??如果不計(jì)算光照衰減,是沒(méi)有效果的
產(chǎn)生陰影
在下面增加一段代碼調(diào)用unity的陰影Shader

完成
效果
產(chǎn)生陰影,也接受陰影。

總結(jié)
第一接受陰影增加關(guān)鍵宏就可以,注意計(jì)算光照衰減。
第二產(chǎn)生陰影單獨(dú)使用一個(gè)pass就可以。
第三軟陰影的使用能提升陰影的效果,但是開銷會(huì)增大。
副光源 ?| 陰影
效果
主光源和副光源

注意事項(xiàng)
點(diǎn)光源不支持實(shí)時(shí)陰影,如果想實(shí)現(xiàn)點(diǎn)光源陰影應(yīng)該采用光照烘焙,
現(xiàn)在場(chǎng)景中的點(diǎn)光源提示黃色。

想要副光源也能夠產(chǎn)生陰影,需要先在URP管線的Inspector面板下為Additional Lights勾選上Cast Shadows。

然后在光源的Inspector面板中,將Shadow Type切換成Soft Shadows
在把點(diǎn)光源設(shè)置成聚光燈,帶有方向。

這樣就沒(méi)有報(bào)錯(cuò)了,
整理合并函數(shù)
前面計(jì)算漫反射和 高光反射的時(shí)候計(jì)算倆遍,我們梳理一遍,
漫反射
計(jì)算漫反射需要,(世界空間法線,世界空間燈光)燈光計(jì)算出NdotL。
在計(jì)算(燈光顏色,燈光衰減),漫反射顏色。
高光
計(jì)算半角向量,需要 (世界空間燈光,世界空間視角)
這樣我們就總結(jié)出5個(gè)需要的數(shù)據(jù)。
(燈光顏色,世界空間燈光位置,燈光衰減 ,世界空間法線, ?世界空間視角)
其中需要燈光顏色,燈光位置,燈光衰減,都是一個(gè)數(shù)據(jù)得到的。
那我們前可以使用一個(gè)函數(shù)獲取這些數(shù)據(jù),在使用一個(gè)函數(shù)計(jì)算光照信息。
創(chuàng)建一個(gè)函數(shù)獲取這些數(shù)據(jù)。
注意 :light.distanceAttenuation 距離衰減和 ? ?****shadowAttenuation 陰影衰減計(jì)算出在陰影效果。
創(chuàng)建第二個(gè)函數(shù) 計(jì)算
在外部我們只需要計(jì)算出燈光位置信息,和法線視角信息就可以。
主光源的效果完成,
在計(jì)算副光源
我們只需要獲取副光源的世界位置。
把主光和副光的經(jīng)合起來(lái),輸出。
效果

源代碼
資料參考
https://www.jianshu.com/p/a8e4dd93d7d6