URP | 物體多光源
實(shí)現(xiàn)效果
效果


制作思路
默認(rèn)管線
使用多光源計(jì)算,需要倆個Pass渲染光照效果,第一個Pass計(jì)算平行光,第二個Pass計(jì)算點(diǎn)光源,然后第二個Pass疊加到前面。

注意:平行光是沒有光的是衰減,點(diǎn)光源需要考慮光的衰減
URP管線
多光源處理方式大改,不再像Built-in管線那樣死板,全部由Unity的光照路徑?jīng)Q定。
現(xiàn)如今是由URP管線的函數(shù)收集好場景中所有的光照信息,(多個燈的信息)
再傳輸給Pass,由我們開發(fā)者在Pass中決定采用那些光源進(jìn)行光照計(jì)算 ,
計(jì)算完在疊加到光源結(jié)果上。
優(yōu)點(diǎn):
URP這樣處理確實(shí)會降低drawcall來提升明顯的性能 ,雖然會打破合批,但總體來說性能肯定更好
URP管線使用到函數(shù)
我們使用上面學(xué)習(xí)到的獲取光照函數(shù),GetMainLight()函數(shù)獲取主光源
使用 GetAdditionalLightsCount() 函數(shù) 獲取副光源個數(shù)
GetAdditionalLight(index,WS_Pos)函數(shù) ? 獲取其它的副光源世界位置
iindex為燈光id編號,i.positionWS 頂點(diǎn)世界位置。
制作過程
標(biāo)簽管線
使用上面的漫反射Shader
修改渲染層級

2. 增加變量屬性

公用變量
注意: 第一個知識點(diǎn) ? HLSLINCLUDE ?的使用
3. 使用 HLSLINCLUDE 語法 ?把公共字段放進(jìn)去,包括 CBuffer

詳細(xì) 語法 查看
URP | 基礎(chǔ)CG和HLSL區(qū)別
結(jié)構(gòu)體
4. 頂點(diǎn)著色器階段,輸入信息頂點(diǎn)結(jié)構(gòu)體,輸出片元結(jié)構(gòu)體

擴(kuò)展 ?Core函數(shù)
VertexPositionInputs ?VertexNormalInputs 核心的函數(shù)
在 Core 函數(shù)庫里 ?有倆個結(jié)構(gòu)體,是官方給我們創(chuàng)建的好的,

看一下結(jié)構(gòu)體里有那些內(nèi)容

第一個函數(shù) 獲取頂點(diǎn)位置信息,輸出世界空間位置,視圖空間等等。

第二個函數(shù) 獲取頂點(diǎn)法線信息,輸出 世界空間下法線信息,

這里有倆個函數(shù)
輸入 ?法線信息,和 切線信息
輸出 ? 世界空間下法線信息, ? 世界空間下切線信息,世界空間下副切線信息。
下圖是詳細(xì)介紹,是那些空間關(guān)系

資料參考
https://blog.csdn.net/kan464872327/article/details/109605639
頂點(diǎn)階段
注意 : 第二個 關(guān)鍵知識點(diǎn) VertexPositionInputs ? ? VertexNormalInputs
5. 在頂點(diǎn)階段計(jì)算出片元結(jié)構(gòu)體的信息,使用上面介紹的函數(shù)
計(jì)算完成
片元著色器階段
在片元著色器階段是正式開始計(jì)算。
前把頂點(diǎn)著色器階段的數(shù)據(jù)傳入。
采樣貼圖
下面計(jì)算 主光漫反射 效果
漫反射 = ? 主光的顏色,顏色貼圖,漫反射顏色,以及 NdaotL。
在計(jì)算高光部分
輸出顏色
效果

多光源計(jì)算
場景多增加幾個點(diǎn)光源,

現(xiàn)在還是沒有效果,
現(xiàn)在需要我們的開關(guān),增加開關(guān) 變量

使用判斷的語句,如果開啟就執(zhí)行多光源計(jì)算
????前獲取 有多少個副光源,顏色就疊加幾次使用for循環(huán)
????這部分獲取其他副光源的世界空間的位置信息。
計(jì)算漫反射和高光
這一部分和上面的一樣。
注意 : light.distanceAttenuation * light.shadowAttenuation 這一部分是計(jì)算點(diǎn)光源的距離衰減和陰影衰減
在計(jì)算高光。
計(jì)算完的顏色與原來的顏色疊加就可以了,
看一下切換多光源的效果

原代碼
現(xiàn)在這個計(jì)算有倆部分代碼是重復(fù)的。優(yōu)化可以把重復(fù)的使用函數(shù)調(diào)用。
總結(jié)
HLSLINCLUDE ?的使用 ?這一部分是一開始知道,沒有深入理解,

HLSLINCLUDE的使用,可以把公共變量放進(jìn)去,或者公共結(jié)構(gòu)體等,如果多個pass這個方法很好用。
Core函數(shù) 的使用,里面給我們封裝好了函數(shù),直接調(diào)用就可以。

詳細(xì)參考
https://blog.csdn.net/kan464872327/article/details/109605639
多光源效果計(jì)算,主要是獲取其他光源的位置信息,每個燈光在計(jì)算一次。
主要有倆個函數(shù)
GetAdditionalLight()
GetAdditionalLightsCount()

問題: 場景中增加多個點(diǎn)光源的時候出現(xiàn)錯誤,

注意事項(xiàng)
URP管線中,點(diǎn)光源不支持實(shí)時陰影,如果想實(shí)現(xiàn)點(diǎn)光源陰影采用光照烘焙
注意 :點(diǎn)光源和聚光燈都不支持間接反射陰影。

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