Как написать шейдер Unity, учитывающий сортировку слоев?

Я хочу отсортировать свои спрайты, используя слои сортировки Unity. Я прикрепил пользовательский шейдер к одному из своих спрайтов. К сожалению, спрайт с этим шейдером всегда отрисовывается позади других спрайтов, игнорируя слой сортировки.

Как реализовать уважение слоя сортировки в моем шейдере?

Это шейдер, о котором идет речь: заранее спасибо

Properties {
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Main Tex (RGBA)", 2D) = "white" {}
    _Progress ("Progress", Range(0.0,1.0)) = 0.0
}

SubShader {

    Pass {

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

uniform sampler2D _MainTex;
uniform float4 _Color;
uniform float _Progress;

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

v2f vert (appdata_base v)
{
    v2f o;
    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
    o.uv = TRANSFORM_UV(0);

    return o;
}

half4 frag( v2f i ) : COLOR
{
    half4 color = tex2D( _MainTex, i.uv);
    float a = color.a;
    if(i.uv.y < _Progress){
    color = _Color;
    } 
    color.a = a;
    return color;
}

ENDCG

    }
}

}

Я знаю, что мне нужно установить некоторые теги, подобные этому, но я не могу найти подходящую ссылку, а пробы и ошибки ни к чему не приводят:

Tags { "Queue"="Overlay+1" }
ZTest Off
Blend SrcAlpha OneMinusSrcAlpha
Lighting Off
ZWrite On

person f.b.    schedule 24.10.2015    source источник
comment
Спасибо, что добавили ZWrite On в ваши дополнения, все, что я сделал, это добавил ZWrite Off, где принятый ответ указывал на запись этих строк, и это устранило мою проблему с шейдером Z-упорядочения.   -  person Alox    schedule 22.06.2018


Ответы (1)


Вы были на правильном пути. Вот что вам нужно добавить для правильного шейдера спрайтов:

  1. Если ваша игра чисто 2D, вам нужно отключить ZTest, чтобы он не мешал вашему порядку слоев.
  2. Укажите, какой тип смешивания вы собираетесь использовать.
  3. Отметьте, что ваш шейдер переходит в очередь прозрачности.

    SubShader{
        Tags{"Queue" = "Transparent"}
        Pass{
            ZTest Off
            Blend SrcAlpha OneMinusSrcAlpha
            //your CGPROGRAM here
        }
    }
    

В В этом руководстве есть отличная глава о прозрачности, которая очень важна при написании шейдера спрайтов.

person The HamsteR    schedule 27.10.2015