URP | 多光源陰影-陰影支持SRP Batcher
前面?zhèn)z篇是基礎(chǔ),這個是目錄,B站不能增加目錄功能

目的
Shader支持SRP Batcher
Alpha Test 半透明模式支持陰影渲染問題。
效果

半透明
Alpha Test和Alpha Blending是兩種處理透明的方法。
擴(kuò)展 問 :他們有什么區(qū)別嗎?
Alpha Test
Alpha Test是不需要關(guān)閉ZWrite的。
渲染隊列 ? 可以是2000
Alpha Test產(chǎn)生的效果也很極端,要么完全透明,即看不到,要么完全不透明。
效果

Alpha Blending
需要關(guān)閉ZWrite,渲染順序不能亂。
渲染隊列 ? 3000 ?半透明物體
使用一個我們原來制作的一個Shader做的Alpha Blending效果 測試
下圖是關(guān)閉 ZWrite 倆個半透明物體疊加的效果

擴(kuò)展 如果不關(guān)閉出現(xiàn)什么問題?
如果不關(guān)閉ZWrite,那么在進(jìn)行深度檢測的時候,它背后的物體本來是可以透過它被我們看到的,但由于深度檢測時大于它的深度就被剔除了,從而我們就看不到它后面的物體了。因此,我們需要保證物體的渲染順序是從后往前,并且關(guān)閉該半透明對象的ZWrite。
測試結(jié)果

前面的半透明渲染會把后面遮擋住。
因此,我們需要保證物體的渲染順序是從后往前,并且關(guān)閉該半透明對象的ZWrite

特效需要有平滑的過度,大部分使用這個模式。
資料參考
無法增加連接


使用SRP Batcher
在有就是產(chǎn)生的陰影沒有合并優(yōu)化,我們使用多光源就會渲染多次。

在有就是產(chǎn)生的陰影沒有合并優(yōu)化,我們使用多光源就會渲染多次。

我們使用SRP Batcher來合并渲染。
什么是SRP Batcher
SRP Batcher 是一個渲染循環(huán),可加速相同著色器變體的多種材質(zhì)在場景中的CPU渲染速度。
原理
Shader中的變體一致
降低Set Pass Call的消耗
SRP Batcher 通過批處理(batching)—— 系列綁定(Bind)和繪制(Draw)GPU 命令,來減少DrawCalls之間的GPU 設(shè)置(工作量)

設(shè)置管線支持SRP Batcher
首先在Pipeline Asset(渲染管線中)里勾選SRP Batcher。

在下方勾選SRP Batcher

Shader 是否支持SRP Batcher
在Shader界面我們可以看到是否支持這個效果,才會起作用。
not compatible 是不支持

實(shí)現(xiàn)陰影
自定義陰影原理
新建一個Pass 設(shè)置光照模式標(biāo)簽 改成 ?"ShadowCaster”

定義頂點(diǎn)和片元著色器
頂點(diǎn)著色器階段
我們要得到一個以投射專用的裁剪空間坐標(biāo),為了得到這坐標(biāo),
我們需要模型的世界坐標(biāo),模型的世界法線,燈光方向,然后使用函數(shù)
ApplyShadowBias(float3 positionWS, float3 normalWS, float3 lightDirection),
來得到的特殊的世界坐標(biāo),然后轉(zhuǎn)換到裁剪空間得到陰影投射專用的裁剪空間坐標(biāo)。
然后確保陰影偏移后的位置不會超出裁剪空間。
擴(kuò)展
其中這個新函數(shù)的是定義在Shadows.hlsl 下的,它的定義如下。

函數(shù)


計算過程
前把 官方陰影去掉。

開啟前我們把公用變量屬性放到Pass外, 函數(shù)庫放到外面是因?yàn)槲覀冊诘诙€Pass也需要使用。

連結(jié)構(gòu)體我們也放到Pass外

頂點(diǎn)著色器階段
我們前讓這個Pass 簡單的有陰影。
效果 顯示有陰影了,

在Debug里我們看到陰影已經(jīng)使用SRP Batch了,
但是陰影是有問題的,拉近。

或者使用平面看的明顯

我們要得到一個以投射專用的裁剪空間坐標(biāo)
這個函數(shù)需要三個參數(shù),那我們準(zhǔn)備好這三個參數(shù)。

使用函數(shù)計算出裁剪空間的坐標(biāo)。

然后在計算一下是否需要Z值反向,(比如unity編輯器下是DX11,是有Z反向的 )
來取頂點(diǎn) z值和 頂點(diǎn)w值 在乘 近裁剪面兩者之間取最小值;若未Z反向則取最大值。這樣得到的Z值在傳遞給GPU流水線下一個階段。
效果

完成
優(yōu)化結(jié)果
現(xiàn)在只需要8次

代碼

實(shí)現(xiàn)Alpha Test剔除
屬性
定義一個變量控制Alpha變化過程。
使用_CUT_ON ,來開啟關(guān)閉效果
定義變量

定義變量
定義一個開關(guān)是否開啟AlphaTest 效果

第一個Pass
頂點(diǎn)著色器階段
這個是控制我們的Alpha通道的,對貼圖Alpha通道處理。

Clip 剔除
原來輸出的Alpha通道數(shù)值是1. 現(xiàn)在改成我們貼圖的Alpha值。


No模式滑動條可以控制貼圖的顯示,

但是現(xiàn)在陰影沒有產(chǎn)生透過去效果。
陰影支持Alpha模式
這樣的模式很多實(shí)用在半透明物體上,比如樹葉等。
頂點(diǎn)著色器階段
因?yàn)槲覀兪堑诙€Pass里計算陰影,
那需要把我們貼圖的UV信息傳入,這里我們是因?yàn)樯厦姘呀Y(jié)構(gòu)體定義的變量放到Pass為這一個Pass也可以調(diào)用到。
片元著色器階段
使用開關(guān)判斷是否輸出AlphaTex
至此整體shader就完成了,陰影也支持 透明渲染, 它也兼容了SRP Batcher 。
效果

總結(jié)
對Alpha倆種方式的認(rèn)識和使用。倆種疊加方式的使用,
SRP Batcher 的學(xué)習(xí)使用,把公共屬性,放到Pass外,這樣第二個Pass使用的時候方便調(diào)用不用定義倆次。
函數(shù)庫

結(jié)構(gòu)體

宏

貼圖數(shù)據(jù)

CBUFFER_START

使用第二個Pass制作陰影的時候始終不對,就是因?yàn)榘押甓x放到第一個Pass里了。

陰影Pass實(shí)現(xiàn)過程。
