// Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{ techniques: - passes: - vert: sprite-vs:vert frag: sprite-fs:frag depthStencilState: depthTest: false depthWrite: false blendState: targets: - blend: true blendSrc: src_alpha blendDst: one_minus_src_alpha blendDstAlpha: one_minus_src_alpha rasterizerState: cullMode: none properties: alphaThreshold: { value: 0.5 } uvScale: { value: [1.0,1.0]} halfMapSize: { value: [2500.0,2500.0]} fadeOutRange: { value: 1000.0} edgeColor: { value: [1.0,0.0,0.0,1.0] } edgeFactor: { value: 1.0 } }% CCProgram sprite-vs %{ precision highp float; #include #if USE_LOCAL #include #endif #if SAMPLE_FROM_RT #include #endif in vec3 a_position; in vec2 a_texCoord; in vec4 a_color; out vec4 color; out vec2 uv0; out vec4 worldPos; uniform ConstantsVS{ vec2 uvScale; }; vec4 vert () { vec4 pos = vec4(a_position, 1); #if USE_LOCAL pos = cc_matWorld * pos; #endif worldPos = pos; #if USE_PIXEL_ALIGNMENT pos = cc_matView * pos; pos.xyz = floor(pos.xyz); pos = cc_matProj * pos; #else pos = cc_matViewProj * pos; #endif uv0 = a_texCoord; uv0 = uv0 * uvScale; #if SAMPLE_FROM_RT CC_HANDLE_RT_SAMPLE_FLIP(uv0); #endif color = a_color; return pos; } }% CCProgram sprite-fs %{ precision highp float; #include #include #include in vec4 color; in vec4 worldPos; #if USE_TEXTURE in vec2 uv0; #pragma builtin(local) layout(set = 2, binding = 12) uniform sampler2D cc_spriteTexture; #endif uniform Constants{ vec4 edgeColor; vec2 halfMapSize; float fadeOutRange; float edgeFactor; }; vec4 frag () { vec4 o = vec4(1, 1, 1, 1); #if USE_TEXTURE o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv0); #if IS_GRAY float gray = 0.2126 * o.r + 0.7152 * o.g + 0.0722 * o.b; o.r = o.g = o.b = gray; #endif #endif o *= color; if(edgeFactor >= 0.0){ float halfWidth = halfMapSize.x; float halfHeight = halfMapSize.y; float edgeAlpha = 0.0; float gap1 = (-halfWidth - worldPos.x); float gap2 = (worldPos.x - halfWidth); float gap3 = (-halfHeight - worldPos.y); float gap4 = (worldPos.y - halfHeight); float gap = max(max(gap1,gap2),max(gap3,gap4)); edgeAlpha = 0.0; if(gap > 0.0 ){ if(gap < 4.0){ edgeAlpha = 1.0 * edgeFactor; o.a = 1.0; } else{ edgeAlpha = min(1.0,1.0 - gap / fadeOutRange) * edgeFactor * 0.6; edgeAlpha = pow(edgeAlpha,2.0); } } o.rgb = mix(o.rgb,edgeColor.rgb,edgeAlpha); if(gap > 0.0){ //o.a = max(0.0,1.0 - gap / fadeOutRange); } } ALPHA_TEST(o); return o; } }%