【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面板中调整过颜色和饱和度之后的样子


作者:小毛驴,一个游戏人 
梦想:世界和平   
    
本博客中未标明转载的文章归作者小毛驴所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章