20.Shader多類(lèi)型光源
目錄
????1,渲染路徑
????2,不同光源光照處理
1.渲染路徑(理論)
Unity中, 有3種渲染路徑(Rendering Path),分別是
前向渲染 , 延遲渲染 , 頂點(diǎn)照明渲染(棄用)

前向渲染
前向渲染: 有深度緩沖區(qū)和顏色緩存區(qū), 由深度判斷一個(gè)像素是否可見(jiàn), 如果可見(jiàn)則更新緩沖區(qū)顏色
每次進(jìn)行一次完整的前渲染,都需要渲染該對(duì)象的渲染圖元,
對(duì)于每個(gè)逐像素光源,我們都需要進(jìn)行上面一次完整的渲染流程。如果一個(gè)物體在多個(gè)逐像素光源的影響區(qū)域內(nèi),那么該物體就需要執(zhí)行多個(gè)Pass,每個(gè)Pass 計(jì)算一個(gè)逐像素光源的光照結(jié)果,然后在幀緩沖中把這些光照結(jié)果混合起來(lái)得到最終的顏色值。
延遲渲染
延遲渲染分兩個(gè)pass,
第一個(gè)pass: 不計(jì)算光照, ?只計(jì)算哪些片元可見(jiàn), 將可見(jiàn)的片元的相關(guān)信息存到G-bufffer中 (Geometry幾何)
第二個(gè)pass:利用G-buffer中的信息, 如法線(xiàn)、視角方向、漫反射系數(shù),對(duì)片元進(jìn)行真正的光照計(jì)算
優(yōu)點(diǎn): 適用于多光源的場(chǎng)景
缺點(diǎn): 不支持抗鋸齒 , 不能處理半透明, 對(duì)顯卡有一定要求。
顯卡必須支持 MRT (Multiple RenderTargets)、Shader Mode 3.0及以上、深度渲染紋理以及雙面的模板緩沖。
2.不同光源光照
介紹
1.平行光: 沒(méi)有位置, 只有方向, 沒(méi)有光照衰減
2.點(diǎn)光源: 它呈球體往四周散射 , 隨距離光照衰減
3. 聚光燈: 錐形光, 和點(diǎn)光源差不多
接收光照處理
思路:
使用兩個(gè)pass, 并將光照結(jié)果混合。
普通平行光照 LightMode=ForwardBase
追加光照 LightMode = ForwardAdd
混合方式:Blend One One
追加光照結(jié)果 = 普通平行光照*光照衰減值
核心代碼
(Lighting_specular.shader基礎(chǔ)上修改)
完整代碼:https://github.com/smartgrass/MyCodes/blob/main/ShaderLearning/Lighting_mult.shader

代碼解釋
Tags{"LightMode"="ForwardBase"} 和 ForwardAdd? 標(biāo)記光照輸入類(lèi)型
#pragma multi_compile_fwdbase ForwardBase模式編譯指令
#pragma multi_compile_fwdadd???ForwardAdd模式編譯指令
#ifdef USING_DIRECTIONAL_LIGHT 平行光宏
UNITY_ATTEN_CHANNEL ?用來(lái)兼容不同平臺(tái)的光照衰減通道,一般來(lái)說(shuō)是r通道。
Blend One One? 設(shè)置線(xiàn)性混合
_LightTexture0 ?光照衰減紋理 , Unity為減少計(jì)算量, 衰減結(jié)果做成表
dot(lightCoord,lightCoord)? 燈與頂點(diǎn)于距離的平方,作為查詢(xún)衰減值的坐標(biāo)
總結(jié)
對(duì)追加光源的處理, 只要將LightMode設(shè)為ForwardAdd,? 便能用獲取到額外的光照信息,比如_LightColor0.xyz
追加的pass使用 Blend One One,將普通光照結(jié)果與追加光照結(jié)果混合
其他
多個(gè)光源的渲染順序: 近的光源優(yōu)先, 亮度大的優(yōu)選。
與光源強(qiáng)度、顏色和距離物體的遠(yuǎn)近有關(guān)系, 具體關(guān)系Unity官方?jīng)]說(shuō)明
光的衰減公式,Unity官方?jīng)]說(shuō)明
可以使用距離反比來(lái)計(jì)算
fixed atten = 1.0/_distance; ?
衰減公式還原見(jiàn)大佬的文章
https://zhuanlan.zhihu.com/p/113087810