Sprite添加材质后,被其他没有材质的UI遮挡。

感觉是我的溶解材质渲染优先级低于默认UI材质,但我没有找到调整的方法

CCEffect %{
techniques:

  • passes:
    • vert: vs:vert
      frag: fs:frag
      blendState:
      targets:
      • blend: true
        blendSrc: src_alpha
        blendDst: one_minus_src_alpha
        blendDstAlpha: one_minus_src_alpha
        rasterizerState:
        cullMode: none
        properties:
        u_dissolveMap: { value: white, editor: { tooltip: ‘噪声贴图’ } }
        dissolveThreshold: { value: 0.5, editor: { range:[0, 1, 0.01], slide: true, tooltip: ‘溶解阈值’ } } # 此处定义的参数都必须指向 CCProgram 处对应声明的 uniform
        }%

CCProgram vs %{
precision highp float;
#include

in vec3 a_position;
in vec2 a_texCoord;
in vec4 a_color;

out vec4 color;
out vec2 uv0;

vec4 vert () {
vec4 pos = vec4(a_position, 1);
pos = cc_matViewProj * pos;
uv0 = a_texCoord;
color = a_color;

return pos;

}
}%

CCProgram fs %{
precision highp float;

in vec4 color;

uniform Dissolve{
float dissolveThreshold;// 熔岩阀值[0, 1];
};

#if USE_TEXTURE
in vec2 uv0;
uniform sampler2D u_dissolveMap;// 熔岩形状的纹理;
#pragma builtin(local)
layout(set = 2, binding = 10) uniform sampler2D cc_spriteTexture;
#endif

vec4 frag () {
vec4 o = vec4(1, 1, 1, 1);
float value = 1.0;

#if USE_TEXTURE
    vec4 dissolveMap = texture(u_dissolveMap, uv0); // 如果颜色的 r 分量小于阀值,将这个着色操作丢弃;
    value *= dissolveMap.r;
#endif

 if (value < dissolveThreshold) {
  discard; // 将小于阈值的片段丢弃,形成溶解
}

#if USE_TEXTURE
  o *= texture(cc_spriteTexture, uv0); // 与原纹理混合;
#endif

o *= color;
if (value < dissolveThreshold * 1.1) {
  o = vec4(0.9, 0.6, 0.3, o.a); // 溶解的边缘设置一个边缘过度色
}

return o;

}
}%
这是我的Shader

1赞