【Unity Shaders】Diffuse Shading——向Surface Shader添加properties

原创 2013年12月06日 00:21:44

本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。

这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。

========================================== 分割线 ==========================================




这次是在上一篇的基础上,进一步学习Unity Shaders的Properties。


准备工作


我们假设你已经进行了上一篇里的工作:创建了一个BasicDiffuse.shader,并且看到了Unity自动为你创建的代码:
Shader "Custom/BasicDiffuse" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf Lambert

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		void surf (Input IN, inout SurfaceOutput o) {
			half4 c = tex2D (_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}


实现


Unity Shaders的Properties指的是上述代码中第2至4行的内容。你可以看到它们被一个被标有Properties大括号所包含。这里面的每一项代表了将会出现在Unity Inspector中的GUI,例如一张可供拖放的2D Texture、一个Color等等。这些值将可以使用户可以方便地调整参数来实现不同的渲染效果。又一次,Unity帮我们做好了GUI的创建工作,我们只需要在这里添加相应的一行,就可以在Inspector界面里快速创建一个可供调整的GUI。
现在,Properties只包含了一项内容,即_MainTex。下面我们进行一些更改:
  1. 将_MainTex这一行删除,在其位置添加新的代码:_EmissiveColor ("Emissive Color"Color) = (1,1,1,1)
  2. 保存后,进入Unity查看效果。Unity将自动编译该shader,随后就可以在Material的Inspector页面上看到新的GUI。
  3. 继续添加两行代码,完整代码如下所示:
    	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
    	}


    保存后,进入Unity查看编译结果。
  4. 不出意外的话,你应该会看到下面的画面:
  5. 现在,你可以尝试在Unity的Inspector里面调整你刚才添加的这些Properties了!

解释


通过上面的尝试,如果你仔细观察过上述代码的特征,应该可以自己总结出来这是怎么工作的。
如上图所示,Properties中的每一项共包含四个部分(缺一不可):
  1. 首先,你需要定义变量名称,这些名称将会在shader后面的编写中方便你引用它们,这很像我们编写C#、C++等代码时定义的变量名;
  2. 接下来,是GUI名称,这些将会出现在Unity的Inspector界面里,也就是用户会看到的名字,正如上一部分图中所示那样。这些名字和编写shader没有直接关系,只是为了方便用户理解;
  3. 再下面是类型。例如,Unity自动生成的代码中的_MainTex类型为2D,表明这是一个2D贴图,我们之前定义的_EmissiveColor类型为Color。Unity支持的类型可见下表:
  4. 最后,是默认值。这是不可省略的。
细心的你可能发现,在Unity自动创建的代码中,_MainTex还包含了一个花括号:
_MainTex ("Base (RGB)"2D) = "white" {}
从Unity的官方文档里(见下),你可以了解到它的作用,在后面的章节中当然也会讲到。简单来讲,这些花括号仅针对类型为2D、Rect和Cube的变量,如果你在其他类型变量后面添加了这些括号会出现编译错误。
这部分的官方文档,请见这里


好啦,就到这里。休息一会儿吧!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Unity Surface Shader 示例分析

对于Unity中的表面着色器(Surface Shader),它的代码整体结构如下所示:      Shader "name" {          Properties {           ...

Unity3D开发之Unity5版本自写Shader没有雾的效果问题

原本项目是Unity 4.6版本的,升级到Unity 5之后发现原本的雾不再看见了,然后查了一下相关资料,发现官方是改变了雾的渲染。 这里有相关的官方方式: http://forum.unity3...

【浅墨Unity3D Shader编程】之八 Unity5新版Shader模板源码解析&径向模糊屏幕特效的实现

概要:本文对Unity5中全新的三种Shader模板的源码进行了解析,然后还讲解了运动模糊屏幕特效的实现方法。 Unity5和之前的书写模式有了一定的改变。Unity5时代的Shader Refere...
  • zhmxy555
  • zhmxy555
  • 2015年10月25日 20:26
  • 27178

【Unity Shader】自定义材质面板的小技巧

写在前面之前遇到过一些朋友问怎么在材质面板里定义类似于bool这种变量,控制一些代码的执行。我们当然可以写一个C#文件来自定义材质面板,就像Unity为Standard Shader写材质面板一样(你...

UNITY3D shader学习心得<一> properties属性接口

注意:shader  不区分大小写   名称规范:在变量前面加_下划线,首字母也大写  //声明shader在下拉菜单里的路径 shader "Custom/AAA" {          //定义...

【Unity Shaders】Diffuse Shading——创建一个基本的Surface Shader

这一次的工作非常简单,我们主要是为了了解Unity Shaders的基本工作原理。 准备工作 创建一个新的Unity Project在Assets目录下新建一个文件夹:Shaders在Assets...

Unity3D中继承在ios上的UIApplicationDelegate

有时我们需要修改Unity为我们生成的在ios上的代码,通常可能要修改主要的是UnityAppController这个类,他是ios的UIApplicationDelegate。我们能想到的方法就是能...
  • leonwei
  • leonwei
  • 2016年04月08日 18:16
  • 1977

【风宇冲】Unity3D教程宝典之地形

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 前言: 本文不是讲地形编辑器的使用,而是主要讲解(1)地形相关知识(2)使用代码创建地形(3)使用AnimationCurve创建曲...

【Unity Shaders】Diffuse Shading——使用2D ramp texture来创建一个假的BRDF(双向反射分布函数)

终于到了Diffuse Shading一章的最后一篇了!回忆一下,在上一篇中,一共学习了两种改善漫反射光照的方法:一种是完全根据感性认识,使用Half Lembert方法改变了光照值区间,使得物体颜色...

【Unity5.x Shaders】最基本的Surface Shader-Diffuse shader以及Surface中的三种输出结构

某些物体可能具有均匀的颜色和光滑的表面,但光滑程度不足以照射反射光。 这些哑光材料最好用Diffuse Shader。 在现实世界中,不存在纯diffuse materials Di...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Unity Shaders】Diffuse Shading——向Surface Shader添加properties
举报原因:
原因补充:

(最多只允许输入30个字)