Unity Shader學習記錄第一章

學習對象爲大神馮樂樂的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"
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章