如何编写尊重排序层的 Unity 着色器?
How to write a Unity Shader that respects sorting layers?
我想使用 Unity 的排序层对 Sprites 进行排序。我将自定义着色器附加到我的一个 Sprites 上。遗憾的是,使用此着色器的 Sprite 总是落后于其他不尊重排序层的 Sprite。
如何在我的着色器中实现排序层方面?
这就是有问题的着色器:
提前致谢
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
你走在正确的轨道上。以下是您需要为适当的精灵着色器添加的内容:
- 如果您的游戏是纯 2D 游戏,您需要禁用 ZTest,这样它才不会打乱您的图层顺序。
- 指定您要使用的混合类型。
标记您的着色器将进入透明度队列。
SubShader{
Tags{"Queue" = "Transparent"}
Pass{
ZTest Off
Blend SrcAlpha OneMinusSrcAlpha
//your CGPROGRAM here
}
}
This tutorial 有一个关于透明度的很棒的章节,这在编写精灵着色器时非常重要。
我想使用 Unity 的排序层对 Sprites 进行排序。我将自定义着色器附加到我的一个 Sprites 上。遗憾的是,使用此着色器的 Sprite 总是落后于其他不尊重排序层的 Sprite。
如何在我的着色器中实现排序层方面?
这就是有问题的着色器: 提前致谢
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
你走在正确的轨道上。以下是您需要为适当的精灵着色器添加的内容:
- 如果您的游戏是纯 2D 游戏,您需要禁用 ZTest,这样它才不会打乱您的图层顺序。
- 指定您要使用的混合类型。
标记您的着色器将进入透明度队列。
SubShader{ Tags{"Queue" = "Transparent"} Pass{ ZTest Off Blend SrcAlpha OneMinusSrcAlpha //your CGPROGRAM here } }
This tutorial 有一个关于透明度的很棒的章节,这在编写精灵着色器时非常重要。