// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. CCEffect %{ techniques: - passes: - vert: vs frag: fs blendState: targets: - blend: true rasterizerState: cullMode: none properties: texture: { value: white } 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 Common { float time; }; float progress = time; in mediump vec2 v_uv0; in vec4 v_color; vec4 getFromColor(vec2 uv) { return texture(texture, uv); } vec4 getToColor(vec2 uv) { return texture(texture2, uv); } vec4 transition(vec2 p) { // 计算块索引,每个块大小为16x16 vec2 block = floor(p.xy / vec2(16)); // 计算UV噪声,根据进度调整UV噪声 vec2 uv_noise = block / vec2(64); uv_noise += floor(vec2(progress) * vec2(1200.0, 3500.0)) / vec2(64); // 计算扭曲距离,并算出各颜色通道的偏移值 vec2 dist = progress > 0.0 ? (fract(uv_noise) - 0.5) * 0.3 * (1.0 - progress) : vec2(0.0); vec2 red = p + dist * 0.2; vec2 green = p + dist * 0.3; vec2 blue = p + dist * 0.5; return vec4( mix(getFromColor(red).r, getToColor(red).r, progress), mix(getFromColor(green).g, getToColor(green).g, progress), mix(getFromColor(blue).b, getToColor(blue).b, progress), 1.0 ); } void main () { gl_FragColor = v_color * transition(v_uv0); } }%