Files
RedPacketRain/extensions/app/assets/manager/ui/effect/blur.effect
2026-03-04 11:30:40 +08:00

119 lines
3.5 KiB
Plaintext

CCEffect %{
techniques:
- name: opaque
passes:
- vert: vs:vert
frag: fs:frag
depthStencilState:
depthTest: false
depthWrite: false
blendState:
targets:
- blend: true
blendSrc: src_alpha
blendSrcAlpha: src_alpha
blendDst: one_minus_src_alpha
blendDstAlpha: one_minus_src_alpha
rasterizerState:
cullMode: none
properties:
blurSize: { value: [750, 1334] }
blurriness: { value: 1, editor: {range:[0, 1, 0.01], slide: true} }
blurLevel: { value: 1, editor: {range:[1, 3, 1], slide: true} }
}%
CCProgram vs %{
precision highp float;
#include <cc-global>
in vec4 a_position;
in vec2 a_texCoord;
out vec2 v_texCoord;
vec4 vert() {
vec4 pos = cc_matViewProj * a_position;
v_texCoord = a_texCoord;
return pos;
}
}%
CCProgram fs %{
precision highp float;
in vec2 v_texCoord;
#pragma builtin(local)
layout(set = 2, binding = 10) uniform sampler2D cc_spriteTexture;
uniform Constant {
vec2 blurSize;
float blurriness;
float blurLevel;
};
// 模糊处理函数
vec4 blur (vec2 pos) {
float sum = 0.0;
vec4 color = vec4(0);
if (blurLevel == 1.0) {
const float blurRadius = 10.0;
const float blurStep = 1.0;
// 采样周边像素并求出加权平均值,得到最终的像素值
for (float rx = -blurRadius; rx <= blurRadius; rx += blurStep) {
for (float ry = -blurRadius; ry <= blurRadius; ry += blurStep) {
vec2 target = pos + vec2(rx / blurSize[0], ry / blurSize[1]);
float weight = (blurRadius - abs(rx)) * (blurRadius - abs(ry));
target.x = clamp(target.x, 0.0, 1.0);
target.y = clamp(target.y, 0.0, 1.0);
color += texture(cc_spriteTexture, target) * weight;
sum += weight;
}
}
} else if(blurLevel == 2.0) {
const float blurRadius = 20.0;
const float blurStep = 2.0;
// 采样周边像素并求出加权平均值,得到最终的像素值
for (float rx = -blurRadius; rx <= blurRadius; rx += blurStep) {
for (float ry = -blurRadius; ry <= blurRadius; ry += blurStep) {
vec2 target = pos + vec2(rx / blurSize[0], ry / blurSize[1]);
float weight = (blurRadius - abs(rx)) * (blurRadius - abs(ry));
target.x = clamp(target.x, 0.0, 1.0);
target.y = clamp(target.y, 0.0, 1.0);
color += texture(cc_spriteTexture, target) * weight;
sum += weight;
}
}
} else {
const float blurRadius = 30.0;
const float blurStep = 3.0;
// 采样周边像素并求出加权平均值,得到最终的像素值
for (float rx = -blurRadius; rx <= blurRadius; rx += blurStep) {
for (float ry = -blurRadius; ry <= blurRadius; ry += blurStep) {
vec2 target = pos + vec2(rx / blurSize[0], ry / blurSize[1]);
float weight = (blurRadius - abs(rx)) * (blurRadius - abs(ry));
target.x = clamp(target.x, 0.0, 1.0);
target.y = clamp(target.y, 0.0, 1.0);
color += texture(cc_spriteTexture, target) * weight;
sum += weight;
}
}
}
color /= sum;
return color;
}
vec4 frag () {
// 获取纹理像素颜色
vec4 o = vec4(1, 1, 1, 1);
o *= texture(cc_spriteTexture, v_texCoord);
// 执行模糊逻辑
vec4 color = blur(v_texCoord);
color.a = o.a;
o = o + (color-o) * blurriness;
return o;
}
}%