我对着色器还很陌生,我刚刚为2D精灵制作了一个。问题是,当我使用着色器(包括也在使用着色器的精灵)将任何一个精灵移动到一个精灵之前时。
在此示例中,与网格对齐的精灵使用我的着色器,而位于中心的精灵使用Sprites-Default。
在后面,它按您期望的那样工作:
在前端,由于某种原因将其他子画面显示在顶部:
我尝试过的事情:
SubShader Tags,Blending,并弄乱了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
}
}
}
答案 0 :(得分:2)
您的着色器总体来说还可以,但是精灵着色器必须尊重sorting layers,但是看起来好像zbuffer会干扰它,请尝试像这样添加ZWrite Off
:
// ... your code
Pass
{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
// ...your code