精灵消失着色器

Sprite disappear shader

我正在开发 Unity 2D 平台游戏。 我正在使用我发现 here 的着色器,但是当我翻转我的精灵时(比例 -1), 精灵消失了,我对着色器编码知之甚少, 而且我没有在 Google 上找到任何帮助,任何人都可以帮助修复着色器吗?。 这是着色器:

Properties {
    [PerRendererData] _MainTex ("Main texture", 2D) = "white" {}
    _DissolveTex ("Dissolution texture", 2D) = "gray" {}
    _Threshold ("Threshold", Range(0., 1.01)) = 0.
}

SubShader {

    Tags { "Queue"="Transparent" }
    Blend SrcAlpha OneMinusSrcAlpha

    Pass {

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"

        struct v2f {
            float4 pos : SV_POSITION;
            float2 uv : TEXCOORD0;
        };

        sampler2D _MainTex;

        v2f vert(appdata_base v) {
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.texcoord;
            return o;
        }

        sampler2D _DissolveTex;
        float _Threshold;

        fixed4 frag(v2f i) : SV_Target {
            float4 c = tex2D(_MainTex, i.uv);
            float val = tex2D(_DissolveTex, i.uv).r;

            c.a *= step(_Threshold, val);
            return c;
        }
        ENDCG
    }
}

精灵被渲染为一个矩形,有两个索引顺序的三角形:顺时针。

您可以将 Shading Mode 更改为 Shaded Wireframe 来检查它。

并且如果你翻转精灵(比例-1),精灵的两个三角形将变为逆时针方向。而且,GPU 不会渲染逆时针三角形。这就是为什么你的精灵消失了。另见 what is a clockwise face in openGL

如果你想在翻转时看到你的精灵,你可以

  1. 创建两个具有相同纹理的精灵:一个普通精灵和一个翻转精灵:

    MySprite
     |--Normal
     |--Flipped (scaled -1)
    

    然后,将 MySprite GameObject 缩放为 -1。

  2. 在着色器中关闭背面剔除。

    只需添加 Cull Off to the subshader. See also this.

    SubShader {
    
        Tags { "Queue"="Transparent" }
        Blend SrcAlpha OneMinusSrcAlpha
    
        Pass {
        Cull Off
        ...