此外引用官方文档中对ShaderLab的解释:
Unity中所有Shader文件都通过一种陈述性语言进行描述,称为“ShaderLab”, Shader文件中用一种嵌套式语法来描述着色器行为,如材质面板中显示的属性、使用的混合模式等等,实际的着色器代码(如HLSL/Cg)定义在CGPROGRAM与ENDCG之间。
着色器文件的根命令为Shader,每个文件都必须调用该命令进行定义,语法如下:
Shader "name"
{
[Properties]
Subshaders
[Fallback]
[CustomEditor]
}
下面对ShaderLab语言进行简单介绍。
1 属性关键字Properties
Unity着色器可通过该关键字定义一个参数列表,该参数列表可在Unity材质面板中进行配置,定义方法如下。
Properties { Property [Property ...] }
数字与滑动条
name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number
通过Range进行定义会在面板中显示为滑动条,基本类型则为可填数字。
着色与向量
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
定义颜色值为RGBA,向量为四维向量。
纹理
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}
定义2D或3D纹理,及cubemap。
示例
// properties for a water shader
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_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) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
Shader中调用
Unity着色器代码中调用属性值,需要定义一个与属性名称与类型都匹配的变量,如:
Shader "Unlit/TestShader"
{
//属性声明
Properties{
_Color("Tint", Color) = (1,1,1,1)
}
//着色器
SubShader{
Pass{
CGPROGRAM
...
//在CG代码中,需