目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:ShaderLab: Properties
版本:2019.1
ShaderLab中的Properties块
Shader可定义一些参数列表在Mertial Inspector中供美术同学设置使用。在shader file文件中的Properties块定义它们。
语法
Properties { Property [Property ...] }
定义了属性块。在花括号内可以定义多个属性,如下:
数值和滑动器
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
这些都定义了一些带有默认值得标量数值属性。Range 形式的类型会让它在Material Inspector中显示为一个带有最小值到最大值得滑动器。
颜色与向量
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
定义了一个带有默认值,分量为RGBA的颜色属性,和一个带有默认值的4D向量属性。颜色属性在Meterial Inspector点击属性项后会显示一个颜色拾取器,并可以按你需要挑战颜色空间(查看 Properties in Shader Programs)。向量属性显示为带有4个数值的输入项。
纹理
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}
分别定义了一个2D texture, cubemap 和3D (volume) texture的属性
详细了解
在shader中每个属性都使用名称来引用(在Unity中,通常shader属性名称都使用下划线开头定命名)。在Material Inspector中显示的名称将会是 display name 参数的名称,而不是变量名称。每个属性的默认值都再赋值号右边提供:
接着是后面的shader的固定函数部分,属性值可以使用属性名字被访问到,放在方括号里:[name]。例如,你可以使用material中的数来定义两个整型数字属性(例如,叫:"_SrcBlend"和"_DstBlend"),让blending mode根据这两个属性来动态调整,然后再 Blend Command 命令中使用它们:Blend [_SrcBlend] [_DstBlend]。
在Properties块中的Shader参数都可以被序列化为 Material 材质的数据。Shader programs shader程序可以拥有更多的属性在运行时通过脚本都设置,即使这些属性不在Properties块中定义也可以通过脚本设置,但这部分属性将不会保存起来。这些属性多数是想完全通过脚本方式来驱动的(使用 Material.SetFloat 之类的函数)。
属性的attribute特性与绘制器
在之前的任意属性中,attributes可选项使用方括号括起来指定的。这些attribute可以被Unity识别,或是你自己写的 MaterialPropertyDrawer classes 的材质属性控件来替代原来的Material Inspector中的默认显示。可被Unity识别的Attribute(上面的MaterialPropertyDrawer class中可以看出其实下面还有内置的没有显示完整,你可以点开上面的连接来看看还有几个内置的):
例子
// water(水材质) shader的属性
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // 滑动器
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // 颜色
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
纹理属性可选项(在5.0或之后的版本中被删除了)
在Unity 5之前,纹理属性可以有一些可选项在花括号里头定义的,例如,TexGen CubeReflect。这些控制固定函数纹理的坐标生成。这些功能在5.0或之后的版本被删除了;如果你需要texgen那逆应该编写vertex shader顶点着色器来替代实现。查看 Implementing Fixed Function TexGen page 页面的例子。