Пользовательский спрайт-шейдер некорректно рендерится, когда что-то перед ним - PullRequest
0 голосов
/ 31 октября 2018

Я довольно новичок в шейдерах, и я только что сделал один для 2D спрайтов. Проблема в том, что я перемещаю любой спрайт перед спрайтом с помощью моего шейдера (включая спрайты, которые также используют мой шейдер).

В этом примере спрайты, выровненные по сетке, используют мой шейдер, а спрайт в центре использует Sprites-Default.

Позади, который работает так, как вы ожидаете:

something is rendered behind my shader

В Front, который по какой-то причине отображает другой спрайт (ы) сверху:

something is rendered in front of my shader

Вещи, которые я пробовал:

Теги SubShader , Смешивание и работа с очередью рендеринга. Но, может быть, я просто пропустил что-то очевидное оттуда.

Я также искал кого-то с подобной проблемой без удачи.

Вот фактический шейдер:

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 голосов
/ 31 октября 2018

Ваш шейдер в целом нормален, но шейдеры спрайтов должны учитывать сортировку слоев , но похоже, что zbuffer мешает ему, попробуйте добавить ZWrite Off следующим образом:

// ... your code

Pass
{
    ZWrite Off
    Blend SrcAlpha OneMinusSrcAlpha

// ...your code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...