spine材质shader的一个疑问

写了一个spine的shader材质,需要在运行时传一个 uniform变量,调用effect的setProperty给shader传uniform变量float u_lineY,测试时节点显示没问题。

但是一修改 skeleton的skeletonData属性以后,效果就没有了,我调试后发现shader是有效的(判断u_lineY小于1.0则显示纯蓝色,否则则把正常颜色红移,u_lineY没有赋值的时候就是0.0),只是unifrom变量会被重置掉,问下各位是如何解决这个问题

为了进一步确定这个问题,我尝试了
const float u_lineY = 130.0; 效果完美,不管skeletonData设置多少次效果都有。

cocos creator 2.0.9
Chrome 73

1赞


问题找到了,材质系统的clone方法里要给新的材质重新设置setProperty :joy::joy::joy:

spine的shader怎么写?

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;
        }
    }`
}


大佬能够给个Demo吗?非常感谢。

mark

大佬,求分享给spine设置shader的代码,我在这里都问了几次了,论坛里很多人跟我一样都写不出来。网上找的都是2.0之前的。只有你实现了

求大佬发个2.0.9版本,spine使用shader的demo可以吗?