83 lines
2.2 KiB
Plaintext
83 lines
2.2 KiB
Plaintext
|
//高斯模糊效果(在华为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; // 传递给着色Shader,varying 来修饰,进行插值
|
|||
|
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);
|
|||
|
}
|
|||
|
}%
|