【Unity Shaders】學習筆記之爲表面着色器添加屬性(四)

     本章主要參考《Unity Shaders and Effects Cookbook》一書,感謝原書作者提供的學習資料

   一、爲表面着色器添加屬性

  着色器的屬性在渲染管道過程中是很重要的,因爲它們是一個接口可以讓使用着色器的美工或用戶指定紋理和調整着色器的值。屬性可以作爲GUI元素暴露在材質的Inspector面板上,而不是單獨的編輯器,它提供了可視化的方法供你調整着色器。

   二、如何操作

  每個Unity着色器都擁有一個內置結構,這些Properties塊也是Unity所希望帶給你的功能之一。這樣做的原因是希望給用戶提供一種快捷方式來創建GUI元素並和着色器代碼綁定。在Properties塊中聲明的屬性可以在接下來的代碼裏用於調整值,顏色或者紋理



 
   Unity提供了很多類型讓我們在着色器裏使用,下表描述了這些類型:

   三、在表面着色器中使用屬性

1.在Properties行下面添加以下幾行代碼
_EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
_AmbientColor  ("Ambient Color", Color) = (1,1,1,1)
_MySliderValue ("This is a Slider", Range(0,10)) = 2.5
2.在CGPROGRAM裏添加
float4 _EmissiveColor;
float4 _AmbientColor;
float _MySliderValue;
3.完成第二步驟之後,你就可以在着色器裏使用屬性值了。我們把_EmissiveColor的屬性值加到_AmbientColor上,然後把計算結果賦值給o.Albedo。將以下代碼加如到surf函數
void surf (Input IN, inout SurfaceOutput o) 
{
	float4 c;
	c =  pow((_EmissiveColor + _AmbientColor), _MySliderValue);
	o.Albedo = c.rgb;
<span style="white-space:pre">	</span>o.Alpha = c.a;
}
4.接下來你可以在材質裏修改Emissive和Ambient的顏色值了
Shader "liulongling/BasicDiffuse" {
	Properties 	
	{
		_EmissiveColor ("Emissive Color", Color) = (1,1,1,1)
		_AmbientColor  ("Ambient Color", 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

		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _MySliderValue;
		
		
		struct Input 
		{
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) 
		{
			float4 c;
			c =  pow((_EmissiveColor + _AmbientColor), _MySliderValue);
			
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		
		ENDCG
	} 
	
	FallBack "Diffuse"
}
pow(arg1,arg2)是自帶的函數,相當於數學公式中的power(求冥),參數1代表底數,參數2代表指數
下面是材質在 Inspector面板中調整過顏色和飽和度之後的樣子


作者:小毛驢,一個遊戲人 
夢想:世界和平   
    
本博客中未標明轉載的文章歸作者小毛驢所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章