Unity3d 如何编写尊重排序层的Unity着色器?

Unity3d 如何编写尊重排序层的Unity着色器?,unity3d,shader,cg,unity3d-2dtools,Unity3d,Shader,Cg,Unity3d 2dtools,我想使用Unitys排序层对精灵进行排序。我在我的一个精灵上附加了一个自定义着色器。不幸的是,具有此着色器的精灵总是在其他精灵后面绘制,而不考虑排序层 如何在我的着色器中实现排序层方面 这就是问题中的着色器: 提前谢谢 Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Main Tex (RGBA)", 2D) = "white" {} _Progress ("Progress", Range(0.0,

我想使用Unitys排序层对精灵进行排序。我在我的一个精灵上附加了一个自定义着色器。不幸的是,具有此着色器的精灵总是在其他精灵后面绘制,而不考虑排序层

如何在我的着色器中实现排序层方面

这就是问题中的着色器: 提前谢谢

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

    }
}

}

你在正确的轨道上。以下是您需要为正确的精灵着色器添加的内容:

  • 如果你的游戏是纯2D的,你需要禁用ZTest,这样它就不会扰乱你的图层顺序
  • 指定要使用的混合类型
  • 标记明暗器将要进入透明区域

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

  • 有一个关于透明度的很好的章节,这在编写精灵着色器时非常重要。

    感谢在您的额外内容中添加ZWrite On,我所做的就是在指定的答案中添加ZWrite Off来写入这些行,并修复了我的Z顺序着色器问题。
    SubShader{
        Tags{"Queue" = "Transparent"}
        Pass{
            ZTest Off
            Blend SrcAlpha OneMinusSrcAlpha
            //your CGPROGRAM here
        }
    }