自定义精灵着色器前面有东西时渲染不正确

时间:2018-10-31 03:27:25

标签: unity3d

我对着色器还很陌生,我刚刚为2D精灵制作了一个。问题是,当我使用着色器(包括也在使用着色器的精灵)将任何一个精灵移动到一个精灵之前时。

在此示例中,与网格对齐的精灵使用我的着色器,而位于中心的精灵使用Sprites-Default。

在后面,它按您期望的那样工作:

something is rendered behind my shader

在前端,由于某种原因将其他子画面显示在顶部:

something is rendered in front of my shader

我尝试过的事情:

SubShader TagsBlending,并弄乱了Render Queue。但是也许我只是从那里错过了一些明显的事情。

我也在寻找没有运气的类似问题的人。

这是实际的着色器:

Shader "Custom/Normal2D"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _Normal("Normal", 2D) = "white" {}
    }

    SubShader
    {
        Tags
        {
            "Queue" = "Transparent"
            "RenderType" = "Transparent"
        }

        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 uv : TEXCOORD0;
            };

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

            v2f vert(appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex, _Normal;
            float _Up, _Dn, _Rt, _Lt;
            //up, down, left, right

            fixed4 frag (v2f i) : SV_Target {
                float4 color = tex2D(_MainTex, i.uv);
                float4 normal = tex2D(_Normal, i.uv);
                float2 n = float2(normal.a * 2 - 1, normal.g * 2 - 1);

                float dt = 1; //dot
                if (distance(float2(0, 0), n) > 0.01) {
                    n = normalize(n);

                    bool Rt = (n.x > 0), Lt = !Rt;
                    bool Up = (n.y > 0), Dn = !Up;

                    /**/ if (Rt && Up) dt = dot(n, float2(_Rt, _Up));
                    else if (Rt && Dn) dt = dot(n, float2(_Rt, _Dn));
                    else if (Lt && Up) dt = dot(n, float2(_Lt, _Up));
                    else if (Lt && Dn) dt = dot(n, float2(_Lt, _Dn));

                    dt = (dt + 1) / 2;
                    dt += 0.5;
                }

                return float4(color.r * dt, color.g * dt, color.b * dt, color.a);
            }

            ENDCG
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您的着色器总体来说还可以,但是精灵着色器必须尊重sorting layers,但是看起来好像zbuffer会干扰它,请尝试像这样添加ZWrite Off

// ... your code

Pass
{
    ZWrite Off
    Blend SrcAlpha OneMinusSrcAlpha

// ...your code