一、前言
Unity ShderLab不常写的话,总是一个模模糊糊的状态,容易忘记。这里列举一下ShaderLab的语法结构来更好的帮助我们学习
二、骨架
Shader "Unlit/NewUnlitShader" // 名字
{
Properties //属性
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
//a2v struct a2v结构体
//v2f struct v2f结构体
//vert func 顶点函数
//frag func 片元函数
ENDCG
}
//可以多个Pass,同个SubPass里的Pass是 &(与)的关系,即会一起起作用
Pass{}
Pass{}
...
}
//可以多个SubShader,SubShader之间是 ||(或)的关系,即最终只会选择一个起作用
SubShader {}
SubShader {}
...
//当所有的SubShader都不符合目标平台时,会保底运行Fallback指定的shader
Fallback "OtherShaderName"
}
三、Properties 属性
格式
【Attribute】_Name(“DisplayName”, PropertyType) = DefaultValue
属性介绍
- 【Attribute】:可加可不加,加了之后可以改变在Inspector面板的显示。
- 如【Toggle】:可以让原本float的类型变成一个开关
- 如【NoScaleOffset】:2D类型在Inspector默认会生成Tilling和Offset选项。加上这个可以取消这两个的显示
- _Name:用于代码识别的变量名字。一般命名都以 ‘_’开始
- DisplayName: 用于Inspector面板显示的变量名字
- PropertyType:属性类型
属性类型比较多,下面会举例说明 - DefaultValue:默认值
根据不同的PropertyType属性,会有不同的默认值
接下来列表说明一下各种PropertyType对应的声明
PropertyType | 声明 |
---|---|
Int | _Int(“Int”,Int) = 1 |
Float | _Float(“Float”,Float) = 1 |
Range(min,max) | _Range(“Range”,Range(0,1)) = 0 |
Color | _Color(“Color”,Color) = (0,0,0,0) |
Vector | _Vector(“Vector”,Vector) = (0,0,0,0) |
2D | _MainTex(“MainTex”,2D) = “” {} |
3D | _3D(“3D”,3D) = “white”{} |
Cube | _Cube(“Cube”,Cube) = “”{} |
在Properties声明属性,主要是为了可以在Inspector面板修改和查看。但想真正在代码中使用属性,得在Pass代码块里再次声明一下。
在Properties声明的叫ShaderLab属性类型;在Pass语义块里再次声明的叫做CG变量类型。这里列举一下它们的对应关系
ShaderLab变量类型 | CG变量类型 |
---|---|
Int | float,half,fixed |
Float | float,half,fixed |
Range(min,max) | float,half,fixed |
Color,Vector | float4,half4,fixed4 |
2D | sampler2D |
3D | sampler3D |
Cube | samplerCube |
四、模板代码
最后,附上一整个模板代码,以更好的浏览和掌握整体结构
Shader "Unilt/CustomUniltShader"
{
Properties
{
_MainTex("MainTex",2D) = "white"{}
}
SubShader
{
Tags{"RenderType"="Opaque" }
pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
struct a2v
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.pos);
o.uv = TRANSFORM_TEX(v.uv,_MainTex);
return o;
}
fixed4 frag(v2f o) : SV_TARGET
{
fixed4 col = tex2D(_MainTex,o.uv);
return col;
}
ENDCG
}
//可以继续增加Pass
//pass{}
//pass{}
}
/**
继续指定SubShader
SubShader
{
}
...
**/
Fallback "Unlit/UnlistShader" //注释掉该行,或者替换成你的Fallback shader
}