【问题标题】:How to write a Unity Shader that respects sorting layers?如何编写一个尊重排序层的 Unity Shader?
【发布时间】:2015-10-24 19:05:30
【问题描述】:

我想使用 Unitys 排序层对我的 Sprite 进行排序。我将自定义着色器附加到我的一个精灵。遗憾的是,带有此着色器的 Sprite 总是在其他不尊重排序层的 Sprite 后面绘制。

如何在我的 Shader 中实现排序层尊重?

这是有问题的着色器: 提前致谢

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

【问题讨论】:

  • 感谢您在您的额外内容中添加 ZWrite On,我所做的只是添加 ZWrite Off,其中接受的答案指定写入这些行并修复了我的 Z 排序着色器问题。

标签: unity3d shader cg unity3d-2dtools


【解决方案1】:

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

  1. 如果您的游戏是纯 2D 游戏,您需要禁用 ZTest,这样它就不会弄乱您的图层顺序。
  2. 指定您要使用的混合类型。
  3. 标记您的着色器将进入透明度队列。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2019-09-13
    相关资源
    最近更新 更多