我是这样,会报错说: [Scene] Pass: setUniform is invoked with incompatible uniform data type for binding 1, expected type is FLOAT4。
我这个shader主要是想创建一块遮罩,但遮罩里面允许一部分矩形不被遮住当做高亮。之前只支持一块地方,现在我想支持多块。于是把center从vec2 center改成了vec4 center[6](其他帖子那里看来说要改成vec4…),rect同样地从vec2改成了center[6]。数组长度写6也只是随便限制一下。
CCEffect %{
techniques:
- passes:
- vert: sprite-vs:vert
frag: sprite-fs:frag
depthStencilState:
depthTest: false
depthWrite: false
blendState:
targets:
- blend: true
blendSrc: src_alpha
blendDst: one_minus_src_alpha
blendDstAlpha: one_minus_src_alpha
rasterizerState:
cullMode: none
properties:
# 方形区域的中心 (UV 坐标,范围 0~1)
center: {
value: [0, 0, 0, 0],
editor: { tooltip: "方形高亮中心" }
}
# 方形区域的 “宽度 & 高度” (UV 单位,范围 0~1)
rectSize: {
value: [0, 0, 0, 0],
editor: { tooltip: "方形高亮尺寸 (UV 单位, e.g. [0.4,0.3])" }
}
ui_resolution: {
value: [1080, 1920],
editor: { tooltip: "屏幕分辨率 (单位:像素)", type: vec2 }
}
# 整个遮罩的颜色 (通常黑色半透明)
overlayColor: {
value: [0.0, 0.0, 0.0, 0.7],
editor: { tooltip: "遮罩颜色 RGBA", type: color }
}
# 羽化宽度
blur: {
value: 10,
editor: { tooltip: "羽化宽度 (UV 单位)" }
}
}%
CCProgram sprite-vs %{
precision highp float;
#include <builtin/uniforms/cc-global>
in vec3 a_position;
in vec2 a_texCoord;
out vec2 v_uv0;
out vec4 v_color;
vec4 vert () {
v_uv0 = a_texCoord;
v_color = vec4(1.0);
return cc_matViewProj * vec4(a_position, 1.0);
}
}%
CCProgram sprite-fs %{
precision highp float;
#include <builtin/internal/alpha-test>
in vec2 v_uv0;
in vec4 v_color;
#if USE_TEXTURE
#pragma builtin(local)
layout(set = 2, binding = 11) uniform sampler2D cc_spriteTexture;
#endif
uniform ARGS {
vec4 center[6]; // 高亮中心(单位:像素)
vec4 rectSize[6]; // 高亮区域尺寸(单位:像素)
vec4 overlayColor; // 遮罩颜色 RGBA
vec2 ui_resolution; // 屏幕分辨率(单位:像素)
float blur; // 羽化宽度(单位:像素)
};
vec4 frag () {
// 当前像素的屏幕坐标(归一化到 0~1)
vec2 st = gl_FragCoord.xy / ui_resolution;
float alpha = 0.0;
// 遍历每个高亮区域
for (int i = 0; i < 6; i++) { // 假设最多支持6个高亮区域
// 归一化坐标
vec2 centerUV = center[i].xy / ui_resolution;
vec2 rectSizeUV = rectSize[i].xy / ui_resolution;
// 计算当前高亮区域的遮罩
vec2 p = st - centerUV;
vec2 halfSize = rectSizeUV * 0.5;
vec2 dist = abs(p) - halfSize;
vec2 cd = max(dist, vec2(0.0));
float outsideDist = length(cd);
float t = smoothstep(0.0, blur / max(ui_resolution.x, ui_resolution.y), outsideDist);
alpha = max(alpha, overlayColor.a * t); // 合并所有高亮区域的效果
}
// 颜色贴图
vec4 baseColor = vec4(1.0); // 默认纯白
#if USE_TEXTURE
baseColor = texture(cc_spriteTexture, v_uv0) * v_color;
#endif
return vec4(overlayColor.rgb, alpha);
}
}%
你是咋定义的?


