6.ShaderLab-ShaderLab语法规则-Shader的子着色器-Tags渲染标签
6.1 知识点
知识回顾
SubShader子着色器基本构成为:
Tags(渲染标签)
States(渲染状态)
Pass(渲染通道1)
Pass(渲染通道2)
Pass(渲染通道n)
渲染标签:通过标签来确定什么时候以及如何对物体进行渲染。
渲染标签的语法结构
Tags{ "标签名1" = "标签值1" "标签名2" = "标签值2" "标签名2" = "标签值2" .......}
渲染标签是通过键值对的形式进行声明的,并且没有数量限制,可以使用任意多个标签。
渲染队列RenderQueue
主要作用:确定物体的渲染顺序
Tags{ "Queue" = "标签值" }
常用Unity预先定义好的渲染队列标签值:
Background(背景)(队列号:1000)
- 最早被渲染的物体的队列,一般用来渲染天空盒或者背景。
- Tags{ "Queue" = "Background" }
Geometry(几何)(队列号:2000)
- 不透明的几何体通常使用该队列,当没有声明渲染队列时,Unity会默认使用这个队列。
Tags{ "Queue" = "Geometry" }
AlphaTest(透明测试)(队列号:2450)
- 有透明通道的,需要进行Alpha测试的几何体会使用该队列。
- 当所有Geometry队列实体绘制完后再绘制AlphaTest队列,效率更高。
Tags{ "Queue" = "AlphaTest" }
Transparent(透明的)(队列号:3000)
- 该队列中几何体按照由远到近的顺序进行绘制,半透明物体的渲染队列,所有进行透明混合的几何体都应该使用该队列。
- 比如:玻璃材质,粒子特效等。
Tags{ "Queue" = "Transparent" }
Overlay(覆盖)(队列号:4000)
- 用是放在最后渲染的队列,于叠加渲染的效果,比如镜头光晕等。
Tags{ "Queue" = "Overlay" }
自定义队列
- 基于Unity预先定义好的这些渲染队列标签来进行加减运算来定义自己的渲染队列。
- 比如:
- Tags{ “Queue” = “Geometry+1” } 代表的队列号就是 2001。
- Tags{ “Queue” = “Transparent-1” } 代表的队列号就是 2999。
- 自定义队列在一些特殊情况下,特别有用。注意加减号中间不要有空格。
- 比如,一些水的渲染想要在不透明物体之后,半透明物体之前进行渲染,就可以自定义。
- 注意:自定义队列只能基于预先定义好的各类型进行计算,不能在Shader中直接赋值数字。如果实在想要直接赋值数字,可以在材质面板中进行设置。
代码
Tags
{
// 渲染队列Queue
// "Queue" = "Background" // 背景队列,队列号:1000
//"Queue" = "Geometry" // 几何体队列,队列号:2000
// "Queue" = "AlphaTest" // 透明测试队列,队列号:2450
// "Queue" = "Transparent" // 透明队列,队列号:3000
// "Queue" = "Overlay" // 覆盖队列,队列号:4000
// 自定义队列
// "Queue" = "Geometry+1" // 自定义队列,队列号:2001
"Queue" = "Transparent-1" // 自定义队列,队列号:2999
}
渲染类型RenderType
主要作用:对着色器进行分类,以便后续可以利用着色器替换功能。在摄像机上,有相应的API可以指定这个渲染类型来替换成其他的着色器。
Tags{
"RenderType" = "标签值"
}
常用的 Unity 预先定义好的渲染类型标签值包括:
Opaque(不透明的)
- 用于普通 Shader,比如:不透明、自发光、反射等。
Transparent(透明的)
- 用于半透明 Shader,比如:透明、粒子。
TransparentCutout(透明切割)
- 用于透明测试 Shader,比如:植物叶子。
Background(背景)
- 用于天空盒 Shader。
Overlay(覆盖)
- 用于 GUI 纹理、Halo(光环)、Flare(光晕)。
了解即可的渲染类型包括:
TreeOpaque
- 用于地形系统中的树干。
TreeTransparentCutout
- 用于地形系统中的树叶。
TreeBillboard
- 用于地形系统中的 Billboarded 树。
Grass
- 用于地形系统中的草。
GrassBillboard
- 用于地形系统中的 Billboarded 草。
代码
Tags
{
// 渲染类型RenderType
"RenderType" = "Opaque" // 不透明的,用于普通Shader,比如:不透明、自发光、反射等
// "RenderType" = "Transparent" // 透明的,用于半透明Shader,比如:透明、粒子
// "RenderType" = "TransparentCutout" // 透明切割,用于透明测试Shader,比如:植物叶子
// "RenderType" = "Background" // 背景,用于天空盒Shader
// "RenderType" = "Overlay" // 覆盖,用于GUI纹理、Halo(光环)、Flare(光晕)
// 以下渲染类型RenderType了解即可
// "RenderType" = "TreeOpaque" // 用于地形系统中的树干
// "RenderType" = "TreeTransparentCutout" // 用于地形系统中的树叶
// "RenderType" = "TreeBillboard" // 用于地形系统中的Billboarded树
// "RenderType" = "Grass" // 用于地形系统中的草
// "RenderType" = "GrassBillboard" // 用于地形系统中的Billboarded草
}
禁用批处理DisableBatching
主要作用:当使用批处理时,模型会被变换到世界空间中,而模型空间会被丢弃。这可能会导致某些使用模型空间顶点数据的 Shader 最终无法实现想要的结果。为了解决这个问题,可以通过开启禁用批处理来达到目的。
总是禁用批处理
Tags{
"DisableBatching" = "True"
}
不禁用批处理(默认值)
Tags{
"DisableBatching" = "False"
}
当 LOD(层级细节)效果激活时才会禁用批处理,这主要用于地形系统上的树。
Tags{
"DisableBatching" = "LODFading"
}
代码
Tags
{
// 禁用批处理DisableBatching
"DisableBatching" = "False" // 不禁用批处理(默认值)
// "DisableBatching" = "True" // 总是禁用批处理
// "DisableBatching" = "LODFading" // LOD效果激活时才会禁用批处理,主要用于地形系统上的树
}
禁止阴影投影ForceNoShadowCasting
主要作用:控制该 SubShader 的物体是否会投射阴影。
不投射阴影
Tags{
"ForceNoShadowCasting" = "True"
}
投射阴影(默认值)
Tags{
"ForceNoShadowCasting" = "False"
}
代码
Tags
{
// 阴影投射控制ForceNoShadowCasting
"ForceNoShadowCasting" = "False" // 投射阴影(默认值)
// "ForceNoShadowCasting" = "True" // 不投射阴影
}
忽略投影机Projector IgnoreProjector
主要作用:确定物体是否受到 Projector(投影机)的投射影响。在 Unity 中,Projector 是一个功能,我们稍后会进行详细讲解。
忽略 Projector
Tags{
"IgnoreProjector" = "True"
}
一般情况下,半透明 Shader 需要开启该标签。
不忽略 Projector(默认值)
Tags{
"IgnoreProjector" = "False"
}
这是默认值,即不忽略 Projector。
代码
Tags
{
// 是否忽略Projector IgnoreProjector
"IgnoreProjector" = "False" // 不忽略Projector(默认值)
// "IgnoreProjector" = "True" // 忽略Projector(一般半透明Shader需要开启该标签)
}
其他标签
是否用于精灵
Tags{ "CanUseSpriteAtlas" = "False" }
预览类型
材质在预览窗口默认为球形,如果想要改变为平面或天空盒
平面
Tags{ "PreviewType" = "Panel" }
天空盒
Tags{ "PreviewType" = "SkyBox" }
代码
Tags
{
// 预览类型 PreviewType
// "PreviewType" = "Panel" // 材质在预览窗口默认为球形,改变为平面
// "PreviewType" = "SkyBox" // 材质在预览窗口默认为球形,改变为天空盒
}
渲染标签的注意事项
以上这些标签只能在SubShader语句块中声明,之后讲解的Pass渲染通道语句块中也可以声明渲染标签。但是今天讲解的内容都不能在Pass中声明。Pass中有自己专门的标签类型,我们会在之后讲解。
总结
渲染标签其实都是以键值对的形式出现的配置。键和值都是字符串类型。这些渲染标签是SubShader和渲染引擎之间的沟通桥梁。我们可以利用渲染标签来告诉Unity我们希望如何以及何时渲染这个对象。
6.2 知识点代码
Lesson06_ShaderLab_ShaderLab语法规则_Shader的子着色器_Tags渲染标签
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson06_ShaderLab_ShaderLab语法规则_Shader的子着色器_Tags渲染标签 : MonoBehaviour
{
void Start()
{
#region 知识回顾
//SubShader子着色器基本构成为:
// --------Tags(渲染标签)
// |--------States(渲染状态)
//SubShader---|--------Pass(渲染通道1)
// |--------Pass(渲染通道2)
// --------....(渲染通道n)
//渲染标签:通过标签来确定什么时候以及如何对物体进行渲染
#endregion
#region 知识点一 渲染标签的语法结构
//Tags{ "标签名1" = "标签值1" "标签名2" = "标签值2" "标签名2" = "标签值2" .......}
//渲染标签是通过键值对的形式进行声明的
//并且没有数量限制,可以使用任意多个标签
#endregion
#region 知识点二 渲染队列RenderQueue
//主要作用:
//确定物体的渲染顺序
//Tags{ "Queue" = "标签值" }
//常用Unity预先定义好的渲染队列标签值:
//1.Background(背景)(队列号:1000)
// 最早被渲染的物体的队列,一般用来渲染天空盒或者背景
// Tags{ "Queue" = "Background" }
//2.Geometry(几何)(队列号:2000)
// 不透明的几何体通常使用该队列,当没有声明渲染队列时,Unity会默认使用这个队列
// Tags{ "Queue" = "Geometry" }
//3.AlphaTest(透明测试)(队列号:2450)
// 有透明通道的,需要进行Alpha测试的几何体会使用该队列
// 当所有Geometry队列实体绘制完后再绘制AlphaTest队列,效率更高
// Tags{ "Queue" = "AlphaTest" }
//4.Transparent(透明的)(队列号:3000)
// 该队列中几何体按照由远到近的顺序进行绘制,半透明物体的渲染队列,所有进行透明混合的几何体都应该使用该队列
// 比如:玻璃材质,粒子特效等
// Tags{ "Queue" = "Transparent" }
//5.Overlay(覆盖)(队列号:4000)
// 用是放在最后渲染的队列,于叠加渲染的效果,比如镜头光晕等
// Tags{ "Queue" = "Overlay" }
//6.自定义队列
// 基于Unity预先定义好的这些渲染队列标签来进行加减运算来定义自己的渲染队列
// 比如:
// Tags{ "Queue" = "Geometry+1" } 代表的队列号就是 2001
// Tags{ "Queue" = "Transparent-1" } 代表的队列号就是 2999
// 注意:+1-1时中间不要有空格 否则报错
// 自定义队列在一些特殊情况下,特别有用
// 比如 一些水的渲染 想要在不透明物体之后,半透明物体之前进行渲染,就可以自定义
// 注意:自定义队列只能基于预先定义好的各类型进行计算,不能在Shader中直接赋值数字
// 如果实在想要直接赋值数字,可以在材质面板中进行设置
#endregion
#region 知识点三 渲染类型RenderType
//主要作用:
//对着色器进行分类,之后可以用于着色器替换功能
//摄像机上有对应的API,可以指定这个渲染类型来替换成别的着色器
//Tags{ "RenderType" = "标签值" }
//常用Unity预先定义好的渲染类型标签值:
//1.Opaque(不透明的)
// 用于普通Shader,比如:不透明、自发光、反射等
//2.Transparent(透明的)
// 用于半透明Shader,比如:透明、粒子
//3.TransparentCutout(透明切割)
// 用于透明测试Shader,比如:植物叶子
//4.Background(背景)
// 用于天空盒Shader
//5.Overlay(覆盖)
// 用于GUI纹理、Halo(光环)、Flare(光晕)
//了解即可
//6.TreeOpaque
// 用于地形系统中的树干
//7.TreeTransparentCutout
// 用于地形系统中的树叶
//8.TreeBillboard
// 用于地形系统中的Billboarded树
//9.Grass
// 用于地形系统中的草
//10.GrassBillboard
// 用于地形系统中的Billboarded草
#endregion
#region 知识点四 禁用批处理
//主要作用:
//当使用批处理时,模型会被变换到世界空间中,模型空间会被丢弃
//这可能会导致某些使用模型空间顶点数据的Shader最终无法实现想要的结果
//可以通过开启禁用批处理来解决该问题
//总是禁用批处理
//Tags{ "DisableBatching" = "True" }
//不禁用批处理(默认值)
//Tags{ "DisableBatching" = "False" }
//了解即可
//LOD效果激活时才会禁用批处理,主要用于地形系统上的树
//Tags{ "DisableBatching" = "LODFading" }
#endregion
#region 知识点五 禁止阴影投影
//主要作用:
//控制该SubShader的物体是否会投射阴影
//不投射阴影
//Tags{ "ForceNoShadowCasting" = "True" }
//投射阴影(默认值)
//Tags{ "ForceNoShadowCasting" = "False" }
#endregion
#region 知识点六 忽略投影机
//主要作用:
//物体是否受到Projector(投影机)的投射
//Projector是Unity中的一个功能(以后讲解)
//忽略Projector(一般半透明Shader需要开启该标签)
//Tags{ "IgnoreProjector" = "True" }
//不忽略Projector(默认值)
//Tags{ "IgnoreProjector" = "False" }
#endregion
#region 知识点七 其他标签
//1.是否用于精灵
//想要将该SubShader用于Sprite时,将该标签设置为False
//Tags{ "CanUseSpriteAtlas" = "False" }
//2.预览类型
//材质在预览窗口默认为球形,如果想要改变为平面或天空盒
//只需要改变预览标签即可
//平面
//Tags{ "PreviewType" = "Panel" }
//天空盒
//Tags{ "PreviewType" = "SkyBox" }
#endregion
#region 知识点八 渲染标签的注意事项
//以上这些标签只能在SubShader语句块中声明
//之后讲解的Pass渲染通道语句块中也可以声明渲染标签
//但是今天讲解的内容都不能在Pass中声明
//Pass中有自己专门的标签类型,我们会在之后讲解
#endregion
#region 总结
//渲染标签其实都是以键值对的形式出现的配置
//键和值都是字符串类型
//这些渲染标签是SubShader和渲染引擎之间的沟通桥梁
//我们可以利用渲染标签来告诉Unity我们希望如何以及何时渲染这个对象
//这些内容,大家可以将其记入自己的笔记当中
//之后在使用他们时,翻看笔记即可
#endregion
}
}
Lesson06_NewUnlitShader.shader
Shader "ShaderTeach/Lesson06_NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
// 渲染队列RenderQueue
// "Queue" = "Background" // 背景队列,队列号:1000
//"Queue" = "Geometry" // 几何体队列,队列号:2000
// "Queue" = "AlphaTest" // 透明测试队列,队列号:2450
// "Queue" = "Transparent" // 透明队列,队列号:3000
// "Queue" = "Overlay" // 覆盖队列,队列号:4000
// 自定义队列
// "Queue" = "Geometry+1" // 自定义队列,队列号:2001
"Queue" = "Transparent-1" // 自定义队列,队列号:2999
// 渲染类型RenderType
"RenderType" = "Opaque" // 不透明的,用于普通Shader,比如:不透明、自发光、反射等
// "RenderType" = "Transparent" // 透明的,用于半透明Shader,比如:透明、粒子
// "RenderType" = "TransparentCutout" // 透明切割,用于透明测试Shader,比如:植物叶子
// "RenderType" = "Background" // 背景,用于天空盒Shader
// "RenderType" = "Overlay" // 覆盖,用于GUI纹理、Halo(光环)、Flare(光晕)
// 以下渲染类型RenderType了解即可
// "RenderType" = "TreeOpaque" // 用于地形系统中的树干
// "RenderType" = "TreeTransparentCutout" // 用于地形系统中的树叶
// "RenderType" = "TreeBillboard" // 用于地形系统中的Billboarded树
// "RenderType" = "Grass" // 用于地形系统中的草
// "RenderType" = "GrassBillboard" // 用于地形系统中的Billboarded草
// 禁用批处理DisableBatching
"DisableBatching" = "False" // 不禁用批处理(默认值)
// "DisableBatching" = "True" // 总是禁用批处理
// "DisableBatching" = "LODFading" // LOD效果激活时才会禁用批处理,主要用于地形系统上的树
// 阴影投射控制ForceNoShadowCasting
"ForceNoShadowCasting" = "False" // 投射阴影(默认值)
// "ForceNoShadowCasting" = "True" // 不投射阴影
// 是否忽略Projector IgnoreProjector
"IgnoreProjector" = "False" // 不忽略Projector(默认值)
// "IgnoreProjector" = "True" // 忽略Projector(一般半透明Shader需要开启该标签)
// 是否用于精灵 CanUseSpriteAtlas
// "CanUseSpriteAtlas" = "False" // 想要将该SubShader用于Sprite时,将该标签设置为False
// 预览类型 PreviewType
// "PreviewType" = "Panel" // 材质在预览窗口默认为球形,改变为平面
// "PreviewType" = "SkyBox" // 材质在预览窗口默认为球形,改变为天空盒
}
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
}
}
}
6.3 练习题
Unity的 ShaderLab 中 Queue 渲染标签的作用是什么?如果我们的Shader是用于渲染透明或半透明物体时,一般需要将Queue的标签值设置为什么?
确定物体的渲染顺序
Tags { "Queue" = "Transparent" }
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com