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

不支1.x,1.10支是API与2.x兼容,底层渲染不同:joy:

mark

可以实现递归渲染吗?所有子节点用父节点的着色器,共用一套渲染方法

理论现实,应该都是可以

想要子节点共用父节点shader?

是个好注意,我也没实践过,下来研究一下呢:slightly_smiling:

赞 谢谢分享

大佬,怎么传入多个纹理数据啊
像这样
uniform sampler2D texture1;
uniform sampler2D texture2;

老铁,我也是多重纹理的问题。

mark,,

老铁们,这个组件很好,首先点个赞。业界良心。

接着问题来了。
好多人都想实现多重纹理。我也要啊,翻遍了论坛都没有Cocos 2.0的实现,只有一个1.5的实现。现在用不了了。哎。悲伤。
在ShaderHelp基础上修改了下代码,发现还是不行,不知道问题出在哪里。确实cocos刚开始搞,也没琢磨过引擎代码。

大佬们帮忙分析下怎么回事,万分感激!
首先在CustomMaterial.js里面 加了一个maskTexture

  var techParams = [
  	{ name: 'texture', type: renderer.PARAM_TEXTURE_2D },
  	{ name: 'maskTexture', type: renderer.PARAM_TEXTURE_2D },
  	{ name: 'color', type: renderer.PARAM_COLOR4 }
  ];

然后在ShaderHelp.js的applyShader函数里面里面加了这个:

material.setParamValue(“maskTexture”, this.mask.getImpl());

this.mask是另外一个Texture2D的对象,直接在编辑器里面通过脚本public赋值的。

  applyShader() {
        if (CC_EDITOR) {
            return;
        }
        this._shaderObject = CustomMaterial.getShaderByIndex(this.program);
        let sprite = this.sprite;
        let params = this._shaderObject.params;
        let defines = this._shaderObject.defines;
        let material = sprite.getMaterial(this._shaderObject.name);
        
        if (!material) {
            material = new CustomMaterial(this._shaderObject.name, params, defines || []);
            sprite.setMaterial(this._shaderObject.name, material);
        }
        this.material = material;
        
        sprite.activateMaterial(this._shaderObject.name);
        //设置Shader参数初值
        if (params) {
            params.forEach((item) => {
                if (item.defaultValue !== undefined) {
                    material.setParamValue(item.name, item.defaultValue);
                }
            });
        }
       //这一行!!!!!
        material.setParamValue("maskTexture", this.mask.getImpl());

        if (this._shaderObject.start) {
            this._shaderObject.start(sprite, material);
        }
    },

接着我在fragment shader里面直接使用masktexture,发现第二个纹理始终采样不上去:我估计是bind纹理哪里
有问题,但是我又不熟悉这部分引擎代码
>

    uniform sampler2D texture;
    uniform sampler2D masktexture;
    varying vec2 uv0;

    uniform float u_edge;
    uniform float maskLoaded;
    void main()
    {
        float edge = u_edge;
        float dis = 0.0;
        vec2 texCoord = uv0;
        gl_FragColor = texture2D( masktexture, texCoord);
    }

大神们,求支个招啊。到底是哪里不对啊。

3赞

好,我发现我的bug的了。都是vscode的坑。masktexture写成小写了,但是搜索大小不分的,我没发现,我好2。改为大写。就可以喜提多纹理了。

1赞

秀啊,老哥,原来直接传一个PARAM_TEXTURE_2D 进去就行了!

~~~~膜拜~~~

不错不错,正想把shader研究一下,感谢大神了

mark

mark

只要将shaderhook加入项目中,不管使不使用都会影响2.0.9的drawcall合并。

那很正常,不是同一材质,是合并不了

不使用依然会影响