CCEffect %{ techniques: - passes: - vert: vs frag: fs blendState: targets: - blend: true rasterizerState: cullMode: none properties: texture: { value: white } wh_ratio: { value: 1, editor: { tooltip: "宽高比" } } blur: { value: 0.35, editor: { tooltip: "光圈模糊程度" } } radius: { value: 0.5, editor: { tooltip: "光圈半径" } } center: { value: [0.5, 0.5], editor: { tooltip: "光圈起点" } } }% 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; #include in vec4 v_color; #if USE_TEXTURE in vec2 v_uv0; uniform sampler2D texture; #endif uniform ARGS{ float radius; float blur; vec2 center; float wh_ratio; }; void main () { vec4 o = vec4(1, 1, 1, 1); o *= texture(texture, v_uv0); o *= v_color; float circle = radius * radius; float rx = center.x * wh_ratio; float ry = center.y; float dis = (v_uv0.x * wh_ratio - rx) * (v_uv0.x * wh_ratio - rx) + (v_uv0.y - ry) * (v_uv0.y - ry); o.a = smoothstep(circle, circle - blur, dis); gl_FragColor = o; } }%