【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 Shaders】Diffuse Shading——向Surface Shader添加properties

这次是在上一篇的基础上,进一步学习Unity Shaders的Properties。 准备工作 我们假设你已经进行了上一篇里的工作:创建了一个BasicDiffuse.shader,并且看到了...
  • candycat1992
  • candycat1992
  • 2013年12月06日 00:21
  • 10733

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

某些物体可能具有均匀的颜色和光滑的表面,但光滑程度不足以照射反射光。 这些哑光材料最好用Diffuse Shader。 在现实世界中,不存在纯diffuse materials Di...
  • TreePulse
  • TreePulse
  • 2016年10月17日 22:33
  • 1412

【Unity Shaders】概述及Diffuse Shading介绍

概述 几个月以前我就一直在找关于Unity Shader相关的资料,大三的时候有一门叫《计算机图形学》,让我觉得如果游戏程序员要从beginner成长为advancer,就必须了解底层渲染的一些知...
  • candycat1992
  • candycat1992
  • 2013年12月03日 17:34
  • 17454

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

这一次的工作非常简单,我们主要是为了了解Unity Shaders的基本工作原理。 准备工作 创建一个新的Unity Project在Assets目录下新建一个文件夹:Shaders在Assets...
  • candycat1992
  • candycat1992
  • 2013年12月05日 00:46
  • 15955

Unity ShaderLab 笔记2 Properties

第一个name,相当于属性变量名,在shader里,可以通过引用这个变量名,获得属性值,第二个display name是在界面上显示的名字。 name ("display name", Range (...
  • dujimache123
  • dujimache123
  • 2012年11月04日 14:00
  • 587

unity3d版本更新日志

What's new in Unity 4.1.2: March 26th, 2013 Features: · Web Player: Secret information can now ...
  • braveyoung123
  • braveyoung123
  • 2013年05月23日 11:06
  • 18673

【Unity Shaders】Diffuse Shading——在Surface Shader中使用properties

在上一篇中,我们已经向Surface Shader中添加了一些properties。在这篇教程里,我们将学习如何在Shader中访问和使用它们,以便通过调整Inspector中的变量来改变渲染效果。 ...
  • candycat1992
  • candycat1992
  • 2013年12月16日 17:24
  • 10751

Unity3D内置Shader私房课(一)视差Parallax

在Unity内建Shader的DefaultResourcesExtra的目录中,可以看到Normal-Parallax.shader这个文件。可以使用这个shader配合法线贴图创建视差效果来更好的...
  • ecidevilin
  • ecidevilin
  • 2016年11月14日 22:37
  • 1608

【Unity Shaders】Diffuse Shading——创建一个自定义的diffuse lighting model(漫反射光照模型)

上一篇中,我们学了怎样在surface shader(这里即指surf函数)中使用自己定义的Properties变量。而在之前的学习中,我们实际上使用的都是Unity内置的Diffuse Lighti...
  • candycat1992
  • candycat1992
  • 2013年12月20日 15:01
  • 14731

常见两种Shader讲解

Vertex and Fragment Shader与Surface Shade的一些常见性质
  • aiyan1111111
  • aiyan1111111
  • 2016年10月24日 22:25
  • 1546
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Unity Shaders】Diffuse Shading——向Surface Shader添加properties
举报原因:
原因补充:

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