No.1
學習對象爲大神馮樂樂的CSDN
本節主要學習了
屬性 Properties
三種自定義光照模型函數
漫反射光照模型
半蘭伯特光照模型
漸變圖實現雙向反射分佈優化的光照模型
tex2D函數 dot函數等
代碼記錄如下
```csharp
Shader "Unlit/BasicDiffuse"
{
Properties
{
_MainTex("texture",2D)="white"{}
_RampTex("_RampTex",2D)="white"{}
_EmissiveColor("EmissiveColor",COLOR)=(1,1,1,1)
_AmbientColor("AmbientColor",COLOR)=(1,1,1,1)
_MySliderValue("This is a Slider",Range(0,10))=2.5
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
//#pragma surface surf Lambert
#pragma surface surf BasicDiffuse_BRDF
sampler2D _MainTex;
sampler2D _RampTex;
//每再屬性 Properties中聲明一個變量時,需要再CGPROGAM中聲明一個和Properties中名稱相同的變量,這將建立一個鏈接,兩者將操作同一個數據
//
float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
//自定義光照模型
//名稱命名爲 Lighting<自定義的光照模型的名稱>
//有三種可供選擇的光照模型函數
//half4 LightingName(SurfaceOutput s,half3 lightDir,half atten){} -這個函數被用於forward rendering(正向渲染),但是不需要考慮view direction(觀察角度)時。
//half4 LightingName(SurfaceOutput s,half3 lightDir,half3 viewDir, half atten){} -這個函數被用於forward rendering(正向渲染),需要考慮view direction(觀察角度)時。
//half4 LightingName_PrePass (SurfaceOutput s, half4 light){} -這個函數被用於需要使用defferred rendering(延遲渲染)時。
inline float4 LightingBasicDiffuse(SurfaceOutput s,fixed3 lightDir,fixed atten)
{
//計算到達該點的光照值 dot返回的結果相當於到達該點入射光的餘弦值 角度越大,值越小,進入人眼光照越少,物體看起來越暗
//max函數放置,光照從相反方向射入時,會出現非預期的效果,比如全黑,所以使用max 函數確保光照值不是非預期效果
float difLight=max(0,dot(s.Normal,lightDir));
//半蘭伯特光照模型 使光照值從0-1.0 變爲0.5-1.0 是物體更亮
float hLambert=difLight*0.5+0.5;
//使用漸變圖控制控制漫反射光照的顏色
float2 tempRamp=(hLambert,hLambert);
float3 ramp=tex2D(_RampTex, tempRamp).rgb;
float4 col;
//計算顏色值COL
//顏色值的rgb由三部分計算得到:
// 一。s的反射率 反射率越大,進入人眼光線越多,顏色越鮮亮
// 二。LightColor0.rgb _LightColor0是unity內置變量,我們可以使用它得到場景中光源的顏色
// 三。最後一個是得到得到的該點的光照值和衰減率的乘積 後面的乘2根據效果自行修改,乘2時光照會更鮮豔
col.rgb=s.Albedo *_LightColor0.rgb * (ramp) /*(hLambert *atten *2)*/;
col.a=s.Alpha;
return col;
}
//自動逸光照模型
//這個自定義光照將使用雙向反射分佈函數
//即考慮觀察值的正向渲染
//新增加參數viewDir 這個參數將由unity 內部提供,來得到當前的觀察點位置到觀察點的方向向量
inline float4 LightingBasicDiffuse_BRDF(SurfaceOutput s,fixed3 lightDir,half3 viewDir,fixed atten)
{
//計算到達該點的光照值 dot返回的結果相當於到達該點入射光的餘弦值 角度越大,值越小,進入人眼光照越少,物體看起來越暗
//max函數放置,光照從相反方向射入時,會出現非預期的效果,比如全黑,所以使用max 函數確保光照值不是非預期效果
//float difLight=max(0,dot(s.Normal,lightDir));
//將上面求光照點的兩個夾角後面的光照改爲veiweDir
float difLight=max(0,dot(s.Normal,viewDir));
//半蘭伯特光照模型 使光照值從0-1.0 變爲0.5-1.0 是物體更亮
float hLambert=difLight*0.5+0.5;
//使用漸變圖控制控制漫反射光照的顏色
float2 tempRamp=(hLambert,hLambert);
float3 ramp=tex2D(_RampTex, tempRamp).rgb;
float4 col;
//計算顏色值COL
//顏色值的rgb由三部分計算得到:
// 一。s的反射率 反射率越大,進入人眼光線越多,顏色越鮮亮
// 二。LightColor0.rgb _LightColor0是unity內置變量,我們可以使用它得到場景中光源的顏色
// 三。最後一個是得到得到的該點的光照值和衰減率的乘積 後面的乘2根據效果自行修改,乘2時光照會更鮮豔
col.rgb=s.Albedo *_LightColor0.rgb * (ramp) /*(hLambert *atten *2)*/;
col.a=s.Alpha;
return col;
}
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
//float4 c;
//c=pow((_EmissiveColor+_AmbientColor),_MySliderValue);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}