Shader/assets/Resources/effect/BlurGauss.effect
2022-07-25 11:11:37 +08:00

83 lines
2.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//高斯模糊效果(在华为P6上不生效)
CCEffect %{
techniques:
- passes:
- vert: vs
frag: fs
blendState:
targets:
- blend: true
rasterizerState:
cullMode: none
properties:
texture: { value: white }
u_degree: { value: 0.03 }
u_brightness: { value: 1.0 }
}%
CCProgram vs %{ // 顶点Shader模块开始
#include <cc-global>
precision highp float; //定义float高精度
in vec3 a_position; // 顶点Shader 从渲染管道里面获取的顶点信息,使用attribute来修饰;
in vec2 a_uv0; // 纹理坐标;
out vec2 uv0; // 传递给着色Shadervarying 来修饰,进行插值
void main () {
gl_Position = cc_matViewProj * vec4(a_position, 1);
uv0 = a_uv0;
}
}%
CCProgram fs %{
#define repeats 5. //重复次数,值越大模糊质量越高,但性能越低
precision highp float;
in vec2 uv0;
uniform sampler2D texture;
uniform ARGS{
float u_degree; //模糊度,外界属性
float u_brightness; //亮度,外界属性
};
// 应用贴图UV
vec4 draw(vec2 uv) {
return texture2D(texture,uv).rgba;
}
float grid(float var, float size) {
return floor(var*size)/size;
}
// 降低亮度
vec4 dim(vec4 col, float factor) {
return vec4(col.r * factor, col.g * factor, col.b * factor, col.a);
}
// 随机值
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
void main()
{
// 模糊贴图
vec4 blurred_image = vec4(0.);
// 重复采样
for (float i = 0.; i < repeats; i++) {
// 第一采样点
vec2 q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i,uv0.x+uv0.y))+u_degree);
vec2 uv2 = uv0+(q*u_degree);
blurred_image += draw(uv2)/2.;
// 第二采样点
q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i+2.,uv0.x+uv0.y+24.))+u_degree);
uv2 = uv0+(q*u_degree);
blurred_image += draw(uv2)/2.;
}
// 中和
blurred_image /= repeats;
// 降低亮度
blurred_image = dim(blurred_image, u_brightness);
// 导出颜色
gl_FragColor = vec4(blurred_image);
}
}%