// 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 } strength: {value: 0.1} 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 strength; 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) { // 获取起始颜色和目标颜色 vec4 ca = getFromColor(p); vec4 cb = getToColor(p); // 计算起始和目标颜色的偏移向量 vec2 oa = (((ca.rg + ca.b) * 0.5) * 2.0 - 1.0); vec2 ob = (((cb.rg + cb.b) * 0.5) * 2.0 - 1.0); // 在起始和目标偏移向量之间进行插值,并乘以强度 vec2 oc = mix(oa, ob, 0.5) * strength; // 根据进度计算权重 float w0 = progress; float w1 = 1.0 - w0; // 使用混合函数混合起始颜色和目标颜色,根据进度进行插值 return mix(getFromColor(p + oc * w0), getToColor(p - oc * w1), progress); } void main () { gl_FragColor = v_color * transition(v_uv0); } }%