Surface Shader 筆記
4. Lighting - Writing Lighting Model
自訂 Lighting Model
定義自己的 Lighting Model,設計好一套表面對於光照的反應
後面在 surface計算時會自動套上 LightModel中的光照計算
此篇為實作筆記
更改 Lighting Model為自訂模型
#pragma surface surf 自訂模型命名
> #pragma surface surf OwnModel
Lighting Function
> Lambert 模型的計算式,如果要不同的光照效果就會在這裡更改算法
half4 Lighting + 模型名 (SurfaceOutput s, 光線方向(half3), 光衰減值(half))
使用表面法線和光源方向進行點積運算,計算出光照強度(夾角大小),再乘上光照顏色後回傳
half4 LightingOwnModel (SurfaceOutput s, half3 lightDir, half atten)
{
half NdotL = dot(s.Normal ,lightDir);
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
c.a = s.Alpha;
return c;
}
註: _LightColor0 定義在 UnityShader文件中,可以取得燈光的顏色
> Blinn - Phong 模型的計算式
half4 Lighting + 模型名 (SurfaceOutput s, 光線方向(half3), 視線方向(half3), 光衰減值(half))
使用視線方向+光源方向 normalize計算出的中途向量,和法線進行點積運算,計算出高光強度
half4 LightingOwnModel (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
{
half3 h = normalize(lightDir + viewDir);
half diff = max (0,dot(s.Normal, lightDir));
float nh = max (0, dot(s.Normal , h));
float spec = pow (nh,48.0);
half4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * atten;
c.a = s.Alpha;
return c;
}
> 卡通的陰影效果,需要一張由左至右深到淺,沒有漸變的 Texture
和 Lambert算法一樣,但使用點積運算出的值來分配 texture uv
Texture (sampler2D _RampTex)
half4 LightingOwnModel (SurfaceOutput s,half3 lightDir,half atten)
{
half diff = dot(s.Normal,lightDir);
float h = diff * 0.4 + 0.5;
float2 rh = h;
float3 ramp = tex2D (_RampTex, rh).rgb;
float4 c;
c.rgb = s.Albedo * _LightColor0.rgb * ramp;
c.a = s.Alpha;
return c;
}
光照模型的筆記發完了
Surface Shader 還有一篇混和的筆記要發
然後我開始寫 vertex shader的筆記了...有夠難诶
一上來又是光照==