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 } _LineColor: { value: [1, 1, 1, 1], editor: { type: color, displayName: "颜色" }, } _LineWidth: { value: 0.1, editor: { range: [0.0, 10.0], displayName: "宽度" } } _TexelSize: { value: [0.001, 0.001], editor: { displayName: "Texel Size" } } }% CCProgram shared-ubos %{ #pragma define-mate USE_HIGH_SAMPLER uniform Constants { vec4 _LineColor; vec2 _TexelSize; float _LineWidth; float test; }; }% CCProgram sprite-vs %{ precision highp float; #include #include in vec3 a_position; in vec2 a_texCoord; in vec4 a_color; out vec4 v_vertexColor; out vec2 v_uv0; out vec4 v_uv1; out vec4 v_uv2; #if USE_HIGH_SAMPLER out vec4 v_uv3; out vec4 v_uv4; #endif vec4 vert() { vec4 pos = vec4(a_position, 1); pos = cc_matViewProj * pos; v_vertexColor = a_color; vec2 width = _LineWidth * _TexelSize.xy; v_uv0 = a_texCoord; v_uv1.xy = v_uv0 + vec2(0.0, 1.0) * width; v_uv1.zw = v_uv0 + vec2(0.0, - 1.0) * width; v_uv2.xy = v_uv0 + vec2(-1.0, 0.0) * width; v_uv2.zw = v_uv0 + vec2(1.0, 0.0) * width; #if USE_HIGH_SAMPLER v_uv3.xy = v_uv0 + vec2(-1.0, - 1.0) * width; v_uv3.zw = v_uv0 + vec2(1.0, 1.0) * width; v_uv4.xy = v_uv0 + vec2(-1.0, 1.0) * width; v_uv4.zw = v_uv0 + vec2(1.0, - 1.0) * width; #endif return pos; } }% CCProgram sprite-fs %{ precision highp float; #include #include #include #include in vec4 v_vertexColor; in vec2 v_uv0; in vec4 v_uv1; in vec4 v_uv2; #if USE_HIGH_SAMPLER in vec4 v_uv3; in vec4 v_uv4; #endif #pragma builtin(local) layout(set = 2, binding = 12)uniform sampler2D cc_spriteTexture; uniform sampler2D _Noisetex; vec4 frag() { vec4 color0 = texture(cc_spriteTexture, v_uv1.xy); vec4 color1 = texture(cc_spriteTexture, v_uv1.zw); vec4 color2 = texture(cc_spriteTexture, v_uv2.xy); vec4 color3 = texture(cc_spriteTexture, v_uv2.zw); float w = color0.a * color1.a * color2.a * color3.a; #if USE_HIGH_SAMPLER vec4 color4 = texture(cc_spriteTexture, v_uv3.xy); vec4 color5 = texture(cc_spriteTexture, v_uv3.zw); vec4 color6 = texture(cc_spriteTexture, v_uv4.xy); vec4 color7 = texture(cc_spriteTexture, v_uv4.zw); w *= color4.a * color5.a * color6.a * color7.a; #endif vec4 color = texture(cc_spriteTexture, v_uv0); color.xyz = mix(_LineColor.rgb, color.rgb, w); color *= v_vertexColor; ALPHA_TEST(color); return color; } }%