本系列主要参考《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的更多相关文章

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

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  2. 【Unity Shaders】概述及Diffuse Shading介绍

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. 【Unity Shaders】《Unity Shaders and Effects Cookbook》总结篇

    我的唠叨 不知不觉,从发表第一篇关于<Unity Shaders and Effects Cookbook>已经快十个月了.一开始的初衷就是学习笔记,毕竟将来回过头去看的时候,再看英文难免 ...

  4. Unity Shaders 第一个默认程序分析

    Unity Shaders 第一个默认程序 Shader "Custom/Shader" { Properties { _MainTex ("Base (RGB)&quo ...

  5. Surface Shader

    Surface Shader: (1)必须放在SubShdader块,不能放在Pass内部: (2)#pragma sufrace surfaceFunction lightModel [option ...

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

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

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

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  8. 【Unity Shaders】Diffuse Shading——漫反射光照改善技巧

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  9. Unity Shader——Writing Surface Shaders(3)——Surface Shader Lighting Examples

    Surface Shader 光照例子 这里有一些自定义光照模型和Surface Shaders的例子.通常的Surface Shader例子在这里. 由于延迟光照在某些自定义的逐材质光照模型中表现得 ...

随机推荐

  1. python笔记十(列表生成式、字典生成式、生成器、生成器的并行)

    一.列表生成式 列表生成式就是python设置的可以用来可以生成列表的. 如要生成一个0-9的列表我们可以通过以下代码实现: >>> list(range(10)) [0, 1, 2 ...

  2. R语言do.call 函数用法详解

    虽然R语言有类型很丰富的数据结构,但是很多时候数据结构比较复杂,那么基本就会用到list这种结构的数据类型.但是list对象很难以文本的形式导出,因此需要一个函数能快速将复杂的list结构扁平化成da ...

  3. UltraISO安装centos7系统

    1. 使用最新版UltraISO将ISO镜像刻录到U盘一定要是最新版,试用版都可以,按下图操作: 2. U盘启动电脑进入安装界面正常情况下你应该会看到下面的这个界面: 选择第一项,然后按TAB键(在评 ...

  4. Docker 工具和示例

    pipework Jérôme Petazzoni 编写了一个叫 pipework 的 shell 脚本,可以帮助用户在比较复杂的场景中完成容器的连接. playground Brandon Rhod ...

  5. matplotlib画散点图,并在散点处打上相应标签

    运行环境: py3.6 matplotlib 2.1.2 x = [2,4,6,7,8,5,4,3] y = [3,6,5,8,4,3,2,4] txt = ['我','今','晚','上','吃', ...

  6. ZooKeeper之(四)配置与命令

    4.1 配置文件 ZooKeeper安装好之后,在安装目录的conf文件夹下可以找到一个名为"zoo_sample.cfg"的文件,是ZooKeeper配置文件的模板. ZooKe ...

  7. [ExtJS5学习笔记]第二十五节 利用window.open()函数实现ExtJS5的登陆页面跳转

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40427543 mvvm方式实现登陆的博客:http://blog.csdn.net/s ...

  8. 密码学Hash函数

    定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H ...

  9. javascript中的XML

    IE下创建DOM并载入XML var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); xmldoc.load(url); //载入X ...

  10. Android Demo---实现从底部弹出窗口

    在前面的博文中,小编简单的介绍了如何制作圆角的按钮以及圆角的图片,伴着键盘和手指之间的舞步,迎来新的问题,不知道小伙伴有没有这样的经历,以App为例,点击头像的时候,会从底部弹出一个窗口,有从相册中选 ...