【分享】Cocos Creator 2.x Shader组件与材质系统

mark

微信下游戏上会报错

1赞

不好意思,之前没在微信上做测试。 感谢你的提示,找到问题,引擎未初始化完成就在调用

if (cc.renderer._forward) {
        cc.renderer._forward._programLib.define(shader.name, shader.vert, shader.frag, shader.defines || []);
        g_shaders[shader.name] = shader;
    } else {
        //在微信上初始时cc.renderer._forward不存在,需要等引擎初始化完毕才能使用
        cc.game.once(cc.game.EVENT_ENGINE_INITED, function () {
            cc.renderer._forward._programLib.define(shader.name, shader.vert, shader.frag, shader.defines || []);
            g_shaders[shader.name] = shader;
        });
    }

代码已经上传github。

1赞

##「奎特尔800+勇士」已经开始

#传送门

uniform float progress[4];
uniform vec2 centres[4];

问下,这两种应该传入什么对象 ?
下面这样写不报错也没有任何效果,看不到东西。
mat.setParamValue(“progress”, [-1.0,-1.0,-1.0,-1.0] );
mat.setParamValue(“centres”, [
new cc.Vec2(0,0),
new cc.Vec2(0,0),
new cc.Vec2(0,0),
new cc.Vec2(0,0),
] );


已解决,看了render-engine.js源码,根据参数读取方式做修改
比如一个float数组给shader

let $createVec4 = (array)=>{
    if (array.length != 4){
        cc.warn("$createVec4 长度不一致!",array)
    }
    const ks = "xyzw";
    let vec4={
        set(index,value){
            this[ ks[index]] = value;
        },
        get(index){
            return this[ ks[index]]
        }
    };
    for (let index = 0;index<4;index++){
        vec4[ ks[index] ] = array[index];
    }
    return vec4;
}

 mat.setParamValue("progress", $createVec4([-1.0,-1.0,-1.0,-1.0]) );



及时雨 Colin大神的也看了 无奈基础太差看不懂 感谢补充

请问如何代码里动态创建sprite,然后代码里给sprite指定shader?

我在代码里放了一个动态创建Sprite 并设置Shader的测试场景,你可以参考一下。

1赞

终于没叫ShaderKiller

:stuck_out_tongue: 其实我很多时间取名叫xxxHelper,但分享出来与我项目中的名字一样不太好。

非常感谢!

非常受用。不过有一点,高斯模糊的效果很奇怪。。。
运行的效果:

预期的效果(Photoshop中处理):

不好意思,Shader程序脚本是网络上找的,上面的效果确实差距很大,你可以尝试一下,修改GaussBlurs中bluramount数值.

    params: [
        {name: 'bluramount', type: renderer.PARAM_FLOAT, defaultValue: 0.006},
    ],

我试了下,还是与你Photoshop中不太一样,应该是算法不同,这方面我也是无能为力,不好意思了!

算法问题,自己研究

谢谢回复。我用的1.9.3的版本也是自己找了些资料在写,得到的效果跟你这张发的很像,不过也是与ps处理的相差太远。2.x的新写法正在研究,谢谢

mark

mark

mark 是否 在2.x以下版本 不能用?

大佬,图片过小MaskShader不能用?