一、前言
Unity ShderLab不常写的话,总是一个模模糊糊的状态,容易忘记。这里列举一下ShaderLab的语法结构来更好的帮助我们学习
二、骨架
Shader "Unlit/NewUnlitShader"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
ENDCG
}
Pass{}
Pass{}
...
}
SubShader {}
SubShader {}
...
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
}
}
Fallback "Unlit/UnlistShader"
}
|