// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. CCEffect %{ techniques: - passes: - vert: vs frag: fs blendState: targets: - blend: true rasterizerState: cullMode: none properties: scale: { value: 20 } smoothness: { value: 0.1 } seed: { value: 12.9898 } time: { value: 0 } }% CCProgram vs %{ precision highp float; #include #include in vec3 a_position; in vec4 a_color; out vec4 v_color; #if USE_TEXTURE in vec2 a_uv0; out vec2 v_uv0; #endif void main () { vec4 pos = vec4(a_position, 1); #if CC_USE_MODEL pos = cc_matViewProj * cc_matWorld * pos; #else pos = cc_matViewProj * pos; #endif #if USE_TEXTURE v_uv0 = a_uv0; #endif v_color = a_color; gl_Position = pos; } }% CCProgram fs %{ precision highp float; uniform sampler2D texture; uniform sampler2D texture2; uniform Perlin { float scale; float smoothness; float seed; float time; }; float progress = time; in mediump vec2 v_uv0; in vec4 v_color; // http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ float random(vec2 co) { highp float a = seed; highp float b = 78.233; highp float c = 43758.5453; highp float dt= dot(co.xy ,vec2(a,b)); highp float sn= mod(dt,3.14); return fract(sin(sn) * c); } // 2D Noise based on Morgan McGuire @morgan3d // https://www.shadertoy.com/view/4dS3Wd float noise (in vec2 st) { vec2 i = floor(st); vec2 f = fract(st); // Four corners in 2D of a tile float a = random(i); float b = random(i + vec2(1.0, 0.0)); float c = random(i + vec2(0.0, 1.0)); float d = random(i + vec2(1.0, 1.0)); // Cubic Hermine Curve. Same as SmoothStep vec2 u = f*f*(3.0-2.0*f); // Mix 4 coorners porcentages return mix(a, b, u.x) + (c - a)* u.y * (1.0 - u.x) + (d - b) * u.x * u.y; } vec4 getFromColor(vec2 uv) { return texture(texture, uv); } vec4 getToColor(vec2 uv) { return texture(texture2, uv); } vec4 transition (vec2 uv) { vec4 from = getFromColor(uv); vec4 to = getToColor(uv); float n = noise(uv * scale); float p = mix(-smoothness, 1.0 + smoothness, progress); float lower = p - smoothness; float higher = p + smoothness; // 根据噪声值进行平滑插值 float q = smoothstep(lower, higher, n); return mix( from, to, 1.0 - q ); } void main () { gl_FragColor = v_color * transition(v_uv0); } }%