快过年了,整个动态下雪覆盖的过程shader

下雪覆盖效果:cocos creator2.4.11 下雪shader_哔哩哔哩_bilibili
版本:2.4.11
2.4.xx应该都能用
当然,这个下雪覆盖不是很科学,有的地方不正确,不符合现实。但是还能凑合用。可以用在模拟经营的游戏上,增加冬天下雪的变化效果。

本来是在写2.4版本的边缘检测。3.x用的人多了,2.x的东西都很少了。
边缘检测会使用卷积给图片降噪,那要是不降噪呢?
想了想,如果不给图片降噪,是啥效果,没想到以外得到了下雪覆盖的效果。
边缘检测实现了:边缘颜色,边缘宽度,背景颜色,两种卷积核算子,三种亮度计算,如果选择“不使用降噪”,那么就是下雪覆盖的效果。

demo仓库
https://gitee.com/xiao_shuai1973/demo-free.git

10赞

大佬,甩个demo出来哇

我建个git

1赞

等你的3.x,冰冻下雪的都需要啊·~最主要的能适配一下spine最好了~~蹲大佬~

3.x的UI使用还是模型使用

ui,现在是在3.x做2d的东西~

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 }
      luminancethreshold: { value: 0.5 }
  • 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

}%

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;
float luminancethreshold;
};

float getLuminance(vec4 color) {

return 0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b;
}
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©;

vec4 color4 = texture(mainTexture, v_uv4);
float luminance = getLuminance(color4);
if (luminance > luminancethreshold) {
return CCFragOutput(vec4(1.0, 1.0, 1.0, 1.0));
}
else {

return CCFragOutput(color4);

}

}
}%

高斯模糊也在注释里,换切一下就是模糊shader

3q
好人一生平安

大佬,希望有一个冰冻特效的Demo。 :grinning:

冰冻特效搞贴图最合适了 :joy:

如果有几十个怪,那冰冻图又多几十张。感觉很占内存