目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:ShaderLab: Properties
版本:2019.1
ShaderLab: Properties
ShaderLab中的Properties块
Shader可定义一些参数列表在Mertial Inspector中供美术同学设置使用。在shader file文件中的Properties块定义它们。
Syntax
语法
Properties
Properties { Property [Property ...] }
定义了属性块。在花括号内可以定义多个属性,如下:
Numbers and Sliders
数值和滑动器
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
这些都定义了一些带有默认值得标量数值属性。Range 形式的类型会让它在Material Inspector中显示为一个带有最小值到最大值得滑动器。
Colors and Vectors
颜色与向量
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个数值的输入项。
Textures
纹理
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}
分别定义了一个2D texture, cubemap 和3D (volume) texture的属性
Details
详细了解
在shader中每个属性都使用名称来引用(在Unity中,通常shader属性名称都使用下划线开头定命名)。在Material Inspector中显示的名称将会是 display name 参数的名称,而不是变量名称。每个属性的默认值都再赋值号右边提供:
- Range和Float属性就是一个单精度浮点数值,例如:“13.37”。
- Color和Vector属性是将四个数值放到圆括号里头的,例如:"(1,0.5,0.2,1)"。
- 对于2D纹理,默认值可以是一个空串,也可以是内置的默认纹理:“white”(RGBA:1,1,1,1),“black”(RGBA:0,0,0,0),“gray”(RGBA:0.5,0.5,0.5),“bump”(RGBA:0.5,0.5,1,0.5)或是"red"(RGBA:1,0,0,0)。
- 对于非2D纹理(Cube,3D,2DArray)默认值是一个空串。当材质中没有对 Cubemap/3D/Array 纹理赋值的话,将会使用 gray颜色(RGBA:0.5,0.5,0.5,0.5)。
接着是后面的shader的固定函数部分,属性值可以使用属性名字被访问到,放在方括号里:[name]。例如,你可以使用material中的数来定义两个整型数字属性(例如,叫:"_SrcBlend"和"_DstBlend"),让blending mode根据这两个属性来动态调整,然后再 Blend Command 命令中使用它们:Blend [_SrcBlend] [_DstBlend]。
在Properties块中的Shader参数都可以被序列化为 Material 材质的数据。Shader programs shader程序可以拥有更多的属性在运行时通过脚本都设置,即使这些属性不在Properties块中定义也可以通过脚本设置,但这部分属性将不会保存起来。这些属性多数是想完全通过脚本方式来驱动的(使用 Material.SetFloat 之类的函数)。
Property attributes and drawers
属性的attribute特性与绘制器
在之前的任意属性中,attributes可选项使用方括号括起来指定的。这些attribute可以被Unity识别,或是你自己写的 MaterialPropertyDrawer classes 的材质属性控件来替代原来的Material Inspector中的默认显示。可被Unity识别的Attribute(上面的MaterialPropertyDrawer class中可以看出其实下面还有内置的没有显示完整,你可以点开上面的连接来看看还有几个内置的):
- [HideInInspector] - 不在material inspector中显示。
- [NoScaleOffset] - material inspector将不显示纹理的tiling/offset字段。
- [Normal] - 表示该纹理贴图应该被设置成一个法线类型的贴图。
- [HDR] - 表示纹理属性应该设置为一个高动态范围图的纹理(HDR)。
- [Gamma] - 表示在UI中将float/vector属性作为sRGB值颜色显示(就当作是颜色来使用),并尽可能的根据需要转换到对应的颜色空间来使用。查看 Properties in Shdaer Programs。
Example
例子
// 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) = "" {}
}
Texture property options (removed in 5.0)
纹理属性可选项(在5.0或之后的版本中被删除了)
在Unity 5之前,纹理属性可以有一些可选项在花括号里头定义的,例如,TexGen CubeReflect。这些控制固定函数纹理的坐标生成。这些功能在5.0或之后的版本被删除了;如果你需要texgen那逆应该编写vertex shader顶点着色器来替代实现。查看 Implementing Fixed Function TexGen page 页面的例子。
See Also
References
- 旧版本的TexGen可以Texture Coordinate Generation