关闭

【Unity Shaders】学习笔记之为表面着色器添加属性(四)

1543人阅读 评论(0) 收藏 举报
分类:

     本章主要参考《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面板中调整过颜色和饱和度之后的样子


作者:小毛驴,一个游戏人 
梦想:世界和平   
    
本博客中未标明转载的文章归作者小毛驴所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

【Unity Shaders】学习笔记之为表面着色器添加属性(四)

本章主要参考《Unity Shaders and Effects Cookbook》一书,感谢原书作者提供的学习资料    一、为表面着色器添加属性   着色器的属性在渲染管道过程中是很重...
  • liulongling
  • liulongling
  • 2016-05-31 22:51
  • 1543

【Unity Shaders】学习笔记之表面着色器(三)

一、表面着色器    1.1 简介   表面着色器代码直接在SubShader中编写,不需要使用Pass,编译器会将代码编译到合适的Pass中    1.2 标签    硬件将通过判...
  • liulongling
  • liulongling
  • 2016-05-31 22:50
  • 2466

Shader山下(五)使用表面着色器实现透明材质

Unity中的表面着色器(Surface Shaders)是一种代码生成的方法,它比底层的顶点(vertex)/像素(pixel)着色程序更容易编写出受光照的着色器。 前几篇中,我们使用的就是表面着色...
  • ecidevilin
  • ecidevilin
  • 2016-10-08 21:30
  • 2012

【Unity Shaders】学习笔记之固定着色器命令(二)

我是小毛驴,一个游戏人,我的梦想是世界和平。转载请注明出处:http://blog.csdn.net/liulongling/article/details/51519006 一、准备  ...
  • liulongling
  • liulongling
  • 2016-05-27 18:53
  • 1433

【Unity Shaders】学习笔记之固定着色器命令(二)

一、准备  在开始着色之前,我们需要创建一个场景(Scene)供我们使用,然后在场景里创建一个球体(Sphere)。    1.1 Diffuse    漫反射计算一个简单的(L...
  • liulongling
  • liulongling
  • 2016-04-12 13:19
  • 353

Unity Shader 学习笔记(29) 表面着色器(Surface Shader)

Unity Shader 学习笔记(29) 表面着色器(Surface Shader)基本结构 参考书籍:《Unity Shader 入门精要》 官网API:Writing Surface ...
  • l773575310
  • l773575310
  • 2017-11-27 22:12
  • 239

Unity3d 表面着色器学习笔记

一. Unity中三种着色器书写格式 surface shaders 表面着色器 vertex and fragment shaders and 顶点和片段着色器 fixed function sha...
  • lyf8068353
  • lyf8068353
  • 2016-01-26 19:04
  • 187

【Unity Shader学习笔记】(一)在表面着色器中控制顶点变换

通常境况下,我们可以方便地使用表面着色器对材质进行简单的金属光泽、平滑度等设置。但是如果要想对顶点进行控制,就需要使用顶点片段着色器。然而,在顶点片段着色器中,连最基本的漫反射、高光等都需要手动去写,...
  • zzlyw
  • zzlyw
  • 2016-12-18 09:40
  • 1959

Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

2010年的Unity 3 中,Surface Shader 出现了。 表面着色器的一个例子。 我们先做如下准备工作。 1)新建一个场景,去掉天空盒子 2)新建一个材质,新建一个Shader,赋给材质...
  • u010848412
  • u010848412
  • 2017-06-28 20:27
  • 203

Unity Shaders表面着色器

1、创建基本的表面着色器 在Assets 中创建文件夹 ,命名为 Materials 。 在 Materials 里面 Create 一个 Shader 。再创建一个 Material 。都命名...
  • u012943521
  • u012943521
  • 2016-07-01 01:14
  • 187
    个人资料
    • 访问:204119次
    • 积分:3064
    • 等级:
    • 排名:第13156名
    • 原创:96篇
    • 转载:12篇
    • 译文:2篇
    • 评论:139条
    感谢支持
    关注我的微博
    博客专栏