在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名称 |
预览下效果:
¶对于顶点着色器
- 顶点着色器名称。
POSITION
的作用是告诉unity将模型顶点位置信息填充带vertex变量中。vertex变量名称自己设定。- 将顶点从模型坐标转换为裁剪坐标。(将模型显示到二维显示器需要做一些矩阵转换)
- 返回转换后的坐标。
- SV_POSITION 作用是告诉unity顶点着色器的输出是裁剪空间中的顶点坐标
当然除了上面通过POSITION
获取的顶点信息。我们还可以获取一些其他信息,如:法线方向,纹理坐标。
1 |