您当前的位置: 首页 >  Jave.Lin unity

Unity ShaderLab Stencil Comp 枚举的对应数值

Jave.Lin 发布时间:2020-12-16 10:00:57 ,浏览量:4

文章目录
  • 字符枚举
  • 官方的文档说明
  • 各种吐槽
  • 枚举对应的 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

在这里插入图片描述

枚举对应的 Float 数值

检测枚举值与数值的对应关系的方法可以在 材质中暴露 Stencil 的 Comp 值,然后在材质编辑器中设置好 Comp 后,打开:FrameDebugger 查看 Comp 的对应字符枚举是哪个就好了

网友验证了,每个数值枚举对应下面几个字符枚举:

  • 0 - Disabled
  • 1 - Never
  • 2 - Less
  • 3 - Equal
  • 4 - LEqual
  • 5 - Greater
  • 6 - NotEqual
  • 7 - GEqual
  • 8 - Always

下面是设置 Stencil Comp0 值时显示的: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
References
  • 【详细解析版】Unity UGUI Mask组件实现原理
关注
打赏
1688896170
查看更多评论

Jave.Lin

暂无认证

  • 4浏览

    0关注

    546博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0848s