// 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 } dots: {value: 80.0} center: {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 { vec2 center; float dots; 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 uv) { // 计算当前UV坐标点到图像中心点的距离 float distanceToCenter = distance(uv, center); // 计算UV坐标点映射到dots纹理中的位置,并计算该位置与纹理中心点的距离 float distanceToDotsCenter = distance(fract(uv * dots), vec2(0.5, 0.5)); // 比较UV坐标点到纹理中心点的距离与进度的比值,如果比值小于等于progress, // 并且distanceToDotsCenter小于distanceToCenter,则认为需要切换到下一张图像 bool nextImage = distanceToDotsCenter < (progress / distanceToCenter); return nextImage ? getToColor(uv) : getFromColor(uv); } void main () { gl_FragColor = v_color * transition(v_uv0); } }%