-
Creator 版本: 3.8.3
-
目标平台: 编辑器
-
重现方式:我给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
}%
- blend: true
- vert: vs:vert
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赞

