Unity Shader概述
一、Unity Shader的基础:ShaderLab
1、定义
ShaderLab是Unity为开发者提供的高层级的渲染抽象层
2、案例:
Shader "Unlit/MyFirstShader" //定义shader的路径和名字
{
//为了方便在材质面板上调数值,在Properties定义属性
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
//可以有多个SubShader,根据硬件情况选择第一个可以在目标平台上运行的SubShader
SubShader
{
Tags { "RenderType"="Opaque" } //标签,可选,用于告诉渲染引擎希望怎样以及何时渲染这个对象
// RenderSetUp{} 状态设置,可选,用于设置显卡的各种状态,例如是否开启混合/深度测试。
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
二、各个板块的详细说明
1、PropertyType
属性类型 | 默认值定义语法 | 例子 | 类型说明 |
Int | number | _Int(“Int”,Int) = 2 | 数字类型 |
Float | number | _Float(“Float”,Float) = 1.5 | 数字类型 |
Range(min,max) | number | _Range(“Range”,Range(0.0,5.0)) = 3.0 | 数字类型 |
Color | (number,number,number,number) | _Color(“Color”,COlor) = (1,1,1,1) | 四维变量 |
Vector | (number,number,number,number) | _Verctor(“Vector”,Vertor) = (2,3,6,1) | 四维变量 |
2D | “defaulttexture”{} | _2D(“2D”,2D) = “”{} | 纹理类型 |
Cube | “defaulttexture”{} | _Cube(“CUben”,Cube) = “white”{} | 纹理类型 |
3D | “defaulttexture”{} | _3D(“3D”,3D) = “black”{} | 纹理类型 |
2、SubShader
- 每个Unity Shader文件可以包含一个或多个SubShader语义块,至少要有一个;
- Unity会选择第一个能够在目标平台上运行的SubShader,如果都不支持,就使用Fallback指定的shader
2.1 标签Tag详解
标签Tag是一个键值对,键值和值都是字符串类型,结构如下:
Tags {“TagName1” = “Value1” “TagName2” = “Value2”}
标签块支持的标签类型如下表:
标签类型 | 说明 | 例子 |
Queue | 控制渲染队列,指定该物体属于哪一个渲染队列,通过这种方式保证所有的透明物体可以在所有不透明物体后面被渲染,也可以自定义使用的渲染队列来控制物体的渲染顺序 | Tags{ “Queue” = “Transparent”} |
RenderType | 对着色器进行分类,例如这是一个不透明的着色器,或是一个透明的着色器等。这可以被用于着色器替换功能 | Tags{“RenderType” = “Opaque”} |
DisableBatching | 一些SubShader在使用Unity的批处理功能时会出现问题,例如使用了模型空间下的坐标进行顶点动画。这时可以通过该标签来直接指明是否对SubShader使用批处理 | {“DisableBatching” = “True”} |
ForceNoShadowCasting | 控制使用该SubShader的物体是否会投射阴影 | Tags{“ForceNoShadowCasting” = “True”} |
IgnoreProjector | 如果该标签值为“True”,那么使用该SubShader的物体将不会受Projector的影响,通常用于半透明物体。 | Tags{“IgnoreProjector” = “True”} |
CanUseSpriteAtlas | 当该SubShader是用于精灵(Sprites)时,将该标签设置为“False” | Tags{“CanUseSpriteAtlas”=“False”} |
PreviewType | 指明材质面板将如何预览该材质。默认情况下,材质将显示为一个球形,我们可以通过把该标签的值设为“Plane”"SkyBox"来改变预览类型 | Tags{“PreviewType”=“Plane”} |
2.2 状态设置,RenderSetup详解
常见渲染状态设置选项如下:
状态名称 | 设置指令 | 解释 |
Cull | Cull Back,Cull Front,Off | 设置剔除模式:剔除背面,剔除正面,关闭剔除 |
ZTest | ZTest Less Greater,LEqual,GEqual,Equal,NotEqual,Always | 设置深度测试时使用的函数 |
ZWrite | ZWrite On,Zwrite Off | 开启深度写入,关闭深度写入 |
Blend(混合模式) | Blend SrcFactor DstFactor | 开启并设置混合模式 |
3、Pass模块
3.1 Pass专用的标签类型
标签类型 | 说明 | 例子 |
LightMode | 定义该Pass在Unity的渲染流水线中的角色 | Tags{“LightMode” = “FrowardBase”} |
RequireOptions | 用于指定当满足某些条件时才渲染该pass,它的值是一个由空格分隔符的字符串。目前,Unity支持的选项有:SoftVegetation。在后面的版本中,可能增加更多的选项 | Tags{“RequireOptions” = “SoftVegetation”} |
3.2 特殊Pass,可用于代码复用或实现更复杂的效果
- UsePass:复用其他UnityShader中的Pass;
- GrabPass:抓取屏幕并将结果存储在一张纹理中,以用于后续的pass处理。
4、Fallback
如果全部SubShader都不能使用,则使用Fallback的shader
注意事项
- UnityShader != shader
UnityShader实际上指的是一个ShaderLab文件。