URP | Lambert/Half-Lanbert光照模型
光照函數(shù)庫
本次我們需要使用光照的,故需要引用光照函數(shù)庫
//光照函數(shù)庫
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
這個庫在那找到打開,下圖

光照的結(jié)構(gòu)體

光照函數(shù) GetMainLight() ? ?獲取燈光。

這里有三個函數(shù)
注意?? HLSL有一個新的變量類型real,定義在commom.hlsl庫里,
這個變量是會根據(jù)不同的平臺編譯float或half。
法線數(shù)據(jù)
模型空間變化到世界空間的法線變換函數(shù)
HLSL 獲取法線變換函數(shù) TransformWorldToObjectNormal

這個函數(shù)在 spaceTransforms.hlsl 這個庫里。
Lambert | 蘭伯特
增加光照函數(shù)庫

模型結(jié)構(gòu)體里獲取頂點法線信息
輸出結(jié)構(gòu)體
頂點著色器階段,調(diào)用模型空間轉(zhuǎn)換到世界空間函數(shù)
注意:第二個變量是讓我們確定是否使用標(biāo)準(zhǔn)向量,一般設(shè)置 true
片元著色器階段獲取光照信息
第一段代碼,定義一個變量 ?獲取場景光源信息 ? ?GetMainLight();
上面也看到函數(shù),有方向,光照距離衰減,陰影衰減,顏色等信息。
Light mylight = GetMainLight();

第二段代碼,獲取光照顏色,real4 變量就是上面說的 -
這個變量是會根據(jù)不同的平臺編譯float或half。
real4 LightColor = real4(mylight.color,1);
第三段代碼,類似獲取光照方向,前面部分是歸一化一下。
float3 LightDir = normalize(mylight.direction);
第四段代碼 ? 計算 LdotN
float LdotN = dot(LightDir,i.normalWS);
效果

Lambert ?蘭伯特光照模型,就是使用 光的方向,和法線方向計算。

漫反射光照符合蘭伯特定律(Lambert's law): 反射光線的強(qiáng)度與表面法線和光源方向之間夾角的余弦值成正比。因此,漫反射部分的計算如下:
Cdiffuse=(Clight · mdiffuse)max(0, n · I ) 其中, n 是表面法線, I 是指向光源的單位矢量, mdiffuse 是材質(zhì)的漫反射顏色, clight 是光源顏色。需要注意的是,我們需要防止法線和光源方向點乘的結(jié)果為負(fù)值,為此,我們使用取最大值的函數(shù)來將其截取到 0, 這可以防止物體被從后面來的光源照亮。
Half-Lanbert ?| 半蘭伯特
半蘭伯特和蘭伯特相比,只是將法線向量與光照方向向量的點乘結(jié)果用一種更好的方式區(qū)間轉(zhuǎn)化到了(0,1)區(qū)間:

效果對比

總結(jié)
學(xué)習(xí)HLSL光照函數(shù)的使用,有哪些新的方法。

頂點法線信息,模型轉(zhuǎn)換到世界空間新的函數(shù)。默認(rèn)設(shè)置 ?true
實現(xiàn)基礎(chǔ)蘭伯特光照模型。