求问3.8.x版本中2d场景如何让一个sprite实现高斯模糊效果?
CCEffect %{
techniques:
- name: opaque
passes:- vert: unlit-vs:vert
frag: unlit-fs:frag
properties: &props
mainTexture: { value: white }
mainColor: { value: [1, 1, 1, 1], editor: { type: color } }
textureSize: { value: [1280, 720] } //图片大小
blurSize: { value: 8.0 } //模糊系数,越大越模糊
- vert: unlit-vs:vert
- name: transparent
passes:- vert: unlit-vs:vert
frag: unlit-fs:frag
blendState:
targets:
- blend: true
blendSrc: src_alpha
blendDst: one_minus_src_alpha
blendSrcAlpha: src_alpha
blendDstAlpha: one_minus_src_alpha
properties: *props
- vert: unlit-vs:vert
}%
CCProgram unlit-vs %{
precision highp float;
#include <legacy/input>
#include <builtin/uniforms/cc-global>
#include <legacy/decode-base>
#include <legacy/local-batch>
#include <legacy/input>
#include <legacy/fog-vs>
in vec2 a_color;
out vec3 v_position;
out vec3 v_normal;
out vec2 v_uv;
out vec2 v_uv0;
out vec2 v_uv1;
out vec2 v_uv2;
out vec2 v_uv3;
out vec2 v_uv4;
out vec2 v_uv5;
out vec2 v_uv6;
out vec2 v_uv7;
out vec2 v_uv8;
out vec4 v_color;
uniform cData {
vec2 textureSize;
float blurSize;
};
//
vec4 vert() {
vec4 position;
CCVertInput(position);
mat4 matWorld, matWorldIT;
CCGetWorldMatrixFull(matWorld, matWorldIT);
vec4 pos = matWorld * position;
v_position = pos.xyz;
v_normal = normalize((matWorldIT * vec4(a_normal, 0.0)).xyz);
v_uv = a_texCoord;
vec2 pixelSize = blurSize * 1.0 / textureSize;
v_uv0 = v_uv + pixelSize * vec2(-1.0, 1.0);
v_uv1 = v_uv + pixelSize * vec2(0.0, 1.0);
v_uv2 = v_uv + pixelSize * vec2(1.0, 1.0);
v_uv3 = v_uv + pixelSize * vec2(-1.0, 0.0);
v_uv4 = v_uv + pixelSize * vec2(0.0, 1.0);
v_uv5 = v_uv + pixelSize * vec2(1.0, 1.0);
v_uv6 = v_uv + pixelSize * vec2(-1.0, - 1.0);
v_uv7 = v_uv + pixelSize * vec2(0.0, - 1.0);
v_uv8 = v_uv + pixelSize * vec2(1.0, - 1.0);
//
return cc_matProj * (cc_matView * matWorld) * position;
}
}%
CCProgram unlit-fs %{
precision highp float;
#include <legacy/output>
#include <legacy/fog-fs>
in vec2 v_uv;
in vec3 v_position;
in vec4 v_color;
in vec2 v_uv0;
in vec2 v_uv1;
in vec2 v_uv2;
in vec2 v_uv3;
in vec2 v_uv4;
in vec2 v_uv5;
in vec2 v_uv6;
in vec2 v_uv7;
in vec2 v_uv8;
uniform sampler2D mainTexture;
uniform sampler2D myTexture;
uniform Constant {
vec4 mainColor;
};
vec4 frag() {
vec4 color0 = texture(mainTexture, v_uv0);
vec4 color1 = texture(mainTexture, v_uv1);
vec4 color2 = texture(mainTexture, v_uv2);
vec4 color3 = texture(mainTexture, v_uv3);
vec4 color4 = texture(mainTexture, v_uv4);
vec4 color5 = texture(mainTexture, v_uv5);
vec4 color6 = texture(mainTexture, v_uv6);
vec4 color7 = texture(mainTexture, v_uv7);
vec4 color8 = texture(mainTexture, v_uv8);
vec4 c = color0 + color1 + color2 + color3 + color4 + color5 + color6 + color7 + color8;
c = c / 9.0; //均值模糊,使用高斯滤波就是高斯模糊(就是权重不一样,均值模糊9个点的权重一样)
return CCFragOutput©;
}
}%
请叫我雷锋
看看哪儿找个shader咯,高斯模糊就是像素朝一个方向叠加若干次
震惊,cocos论坛闪现当代雷锋!!
记得把//去掉
effect里的注释不是//
感谢雷锋大大! 我是shader新手,上面这个effect使用后语法一直报错,好像是论坛自动格式化了,老发大大发下源码,再次感谢!!!
晚上来,建个git仓库给你


