在Unity中所有shader都是使用ShaderLab编写的。一个UnityShader的基本结构如下:
1 | Shader "shaderName" { |
主要包括如下几个部分:
Shader “shaderName”
shader的名称。
Properties
属性的作用是在Inspector面板中显示要向Shader中传递的参数。其语法格式是[Attribute]_PropertyName(“Display Name”, Type) = DefaultValue
其中Property支持的数据类型有如下。其中对于贴图类中字符串部分指unity内置的一些纹理名称,如:”white/black/gray”,大括号中是用来指定一些纹理的属性的。在CG/HLSL语言中,在Properties中定义的属性不能再着色器中直接使用。需要在SubShader中重新定义,并且在使用之前。
常用属性如下:
type | desc |
---|---|
Color | _Color(“> Color”, COLOR) = (1, 1, 1, 1) |
Int | _Int(“> Int”, Int) = 1 |
Float | _Float1(“> Float”,float) = 0.5 |
Range | _Float2(“> Range”, Range( 0 , 1)) = 0.5 |
IntRange | [IntRange]_Float3(“> IntRange”, Range( 0 , 5)) = 1 |
Toggle | [Toggle]_Float4(“> Toggle”,Range(0, 1)) = 1 |
Enum | [Enum(UnityEditor.BuildTarget)]_Float5(“> Enum”,float) = 1 |
Vector | _Vector(“> Vector”, Vector) = (0,0,0,0) |
2D | _MainTex1(“> 2DTexture”, 2D) = “white” {} |
3D | _MainTex2(“> 3DTexture”, 3D) = “” {} |
Cube | _MainTex3(“> Cube”, CUBE) = “” {} |
SubShaders
在一个Shader中至少有一个SubShader,每个SubShader至少有一个Pass; RenderStep(状态)和Tag(标签)为可选。Pass指的就是渲染一次模型。所以尽可能减少Pass的数量,过多会导致性能下降。当Unity需要加载这个Shader时,会扫描所有的SubShader,然后选择第一个能在当前平台运行的SubShader。
FallBack
备用Shader。当上面SubShader中没有一个适合当前设备的时会从FallBack中找一个合适的,如果FallBack中没有就到FallBack的FallBack中找。
- CustomEditor (自定义编辑器)
其中使用’[]’包裹的表示的是可有可无。
做一个简单的效果:
1 | // shader名称 |
预览下效果: