shader和sprite的差不多,我分享一个
let spineShader = {
name: "spineShader_mask",
defines: [
{ name: 'useModel', },
{ name: 'alphaTest', },
{ name: 'use2DPos', },
{ name: 'useTint', }
],
vert: '\n \nuniform mat4 viewProj;\n\n#ifdef use2DPos\n attribute vec2 a_position;\n#else\n attribute vec3 a_position;\n#endif\n\nattribute lowp vec4 a_color;\n#ifdef useTint\n attribute lowp vec4 a_color0;\n#endif\n\n#ifdef useModel\n uniform mat4 model;\n#endif\n\nattribute mediump vec2 a_uv0;\nvarying mediump vec2 uv0;\n\nvarying lowp vec4 v_light;\n#ifdef useTint\n varying lowp vec4 v_dark;\n#endif\n\nvoid main () {\n mat4 mvp;\n #ifdef useModel\n mvp = viewProj * model;\n #else\n mvp = viewProj;\n #endif\n\n #ifdef use2DPos\n vec4 pos = mvp * vec4(a_position, 0, 1);\n #else\n vec4 pos = mvp * vec4(a_position, 1);\n #endif\n\n v_light = a_color;\n #ifdef useTint\n v_dark = a_color0;\n #endif\n\n uv0 = a_uv0;\n\n gl_Position = pos;\n}',
frag:`
uniform sampler2D texture;
varying mediump vec2 uv0;
#ifdef alphaTest
uniform lowp float alphaThreshold;
#endif
varying lowp vec4 v_light;
#ifdef useTint
varying lowp vec4 v_dark;
#endif
// uniform float u_startY;
uniform vec2 u_startYs;
const float dpy = 30.0;
void main () {
vec4 texColor = texture2D(texture, uv0);
vec4 finalColor;
#ifdef useTint
finalColor.a = v_light.a * texColor.a;
finalColor.rgb = ((texColor.a - 1.0) * v_dark.a + 1.0 - texColor.rgb) * v_dark.rgb + texColor.rgb *v_light.rgb;
#else
finalColor = texColor * v_light;
#endif
#ifdef alphaTest
if (finalColor.a <= alphaThreshold) discard;
#endif
// 由下往上扫描图像纹理
if ( gl_FragCoord.y < (u_startYs.y - dpy) ){
discard;
}else if ( gl_FragCoord.y > (u_startYs.x + dpy) ){
discard;
}else if ( gl_FragCoord.y > u_startYs.y && gl_FragCoord.y < u_startYs.x ){
gl_FragColor = finalColor;
}else if ( gl_FragCoord.y >= u_startYs.x ){
float dy = gl_FragCoord.y - u_startYs.x;
finalColor.a = finalColor.a * (1.0 - dy/dpy);
gl_FragColor = finalColor;
}else {
// gl_FragCoord.y < u_startYs.y
float dy = u_startYs.y - gl_FragCoord.y;
finalColor.a = finalColor.a * (1.0 - dy/dpy);
gl_FragColor = finalColor;
}
}`
}