- 字符枚举
- 官方的文档说明
- 各种吐槽
- 枚举对应的 Float 数值
- References
之前翻译过 Unity 官方的一篇 Stencil 相关的文章:Unity Shader - ShaderLab: Stencil 模板(缓存)
但是不得不说,之前版本的 Unity 文档真的说的不够详细
但是到今天为止,还是不够详细,我不知道他们是怎么想的
在 2021/07/02 我发现 unity 在后续的一些文档,终于有更新了,在 2020.3 版本以上的文档都有对应的枚举定义了 : ShaderLab command: Stencil
字符枚举在 ShaderLab 在,我们可以指定:
Stencil {
Ref xxx
Comp Always
Pass Replace
Fail Keep
ZFail Keep
}
官方的文档说明
- StencilOp
- CompareFunction - (我已经反馈提交给官方:没有数值对应的枚举值,就看他们过这么多年了,还有没用心维护)
在 ShaderLab中的 Stencil 的 Comp ,也是一些枚举值,目前是 Always 值,但这个 Always 对应的是那些值 Float数值是什么,官方文档竟然没有写
我是真的一个字:服~!!!
在 2015年有人问过,2020年了,这个同一个帖子,终于有人吐槽,还是没有更新
帖子:Stencil Op/Comparison Values
检测枚举值与数值的对应关系的方法可以在 材质中暴露 Stencil 的 Comp 值,然后在材质编辑器中设置好 Comp 后,打开:FrameDebugger 查看 Comp 的对应字符枚举是哪个就好了
网友验证了,每个数值枚举对应下面几个字符枚举:
- 0 - Disabled
- 1 - Never
- 2 - Less
- 3 - Equal
- 4 - LEqual
- 5 - Greater
- 6 - NotEqual
- 7 - GEqual
- 8 - Always
下面是设置 Stencil Comp
为 0
值时显示的:Disabled
另外,附送另一些其他的 渲染状态设置 的枚举,可通过 脚本方式来处理:
参考:unity3d shader 代码控制开关属性
Shader "ShaerTest" {
Properties {
_Color("Tint",Color ) = (0.5,0.5,0.5,0.5)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("Src Blend Mode", Float) = 1 //声明外部控制开关
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("Dst Blend Mode", Float) = 1 //声明外部控制开关
[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Float) = 0 //声明外部控制开关
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 0 //声明外部控制开关
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull Mode", Float) = 1 //声明外部控制开关
}
SubShader {
Tags {"Queue"="Geometry" "RenderType"="Opaque"}
LOD 200
Blend [_SrcBlend] [_DstBlend] //获取值应用
ZWrite [_ZWrite] //获取值应用
ZTest [_ZTest] //获取值应用
Cull [_Cull] //获取值应用
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
};
struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
fixed4 color : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
o.color = v.color;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord)*_Color * i.color;
return col;
}
ENDCG
}
}
}
CSharp 代码设置
gameObject.GetComponent().sharedMaterial.SetInt("_ZWrite", 1);
在后面发现原来在 C# API 层有对应的枚举声明:
UnityEngine.Rendering.StencilOp
UnityEngine.Rendering.CompareFunction
UnityEngine.Rendering.ColorWriteMask
- 【详细解析版】Unity UGUI Mask组件实现原理