CocosCreator1.x使用自定義圓角頭像shader


 
module.exports =`

attribute vec4 a_position;

attribute vec2 a_texCoord;

attribute vec4 a_color;

varying vec2 v_texCoord;

varying vec4 v_fragmentColor;

void main()

{

    gl_Position = CC_PMatrix * a_position;

    v_fragmentColor = a_color;

    v_texCoord = a_texCoord;

}

`

 
module.exports =`

#ifdef GL_ES

    precision mediump float;

    #endif



    varying vec4 v_fragmentColor;

    varying vec2 v_texCoord;



    uniform float u_edge;

    uniform float u_offset; 



    

    



    void main()

    {

        float edge = u_edge;

        float dis = 0.0;

        vec2 texCoord = v_texCoord;

        if ( texCoord.x < edge )

        {

            if ( texCoord.y < edge )

            {

                dis = distance( texCoord, vec2(edge, edge) );

            }

            if ( texCoord.y > (1.0 - edge) )

            {

                dis = distance( texCoord, vec2(edge, (1.0 - edge)) );

            }

        }

        else if ( texCoord.x > (1.0 - edge) )

        {

            if ( texCoord.y < edge )

            {

                dis = distance( texCoord, vec2((1.0 - edge), edge ) );

            }

            if ( texCoord.y > (1.0 - edge) )

            {

                dis = distance( texCoord, vec2((1.0 - edge), (1.0 - edge) ) );

            }

        }

  

        if(dis > 0.001)

        {

            // 外圈溝

            float gap = edge * 0.02;

            if(dis <= edge - gap)

            {

                gl_FragColor = texture2D( CC_Texture0,texCoord);

            }

            else if(dis <= edge)

            {

                // 平滑過渡

                float t = smoothstep(0.,gap,edge-dis);

                vec4 color = texture2D( CC_Texture0,texCoord);

                gl_FragColor = vec4(color.rgb,t);

            }else{

                gl_FragColor = vec4(0.,0.,0.,0.);

            }

        }

        else

        {

            gl_FragColor = texture2D( CC_Texture0,texCoord);

        }

    }

`

 
var ShaderUtils = {

    shaderPrograms: {},



    setShader: function(sprite, shaderName) {

        var glProgram = this.shaderPrograms[shaderName];

        if (!glProgram) {

            glProgram = new cc.GLProgram();

            var vert = require(cc.js.formatStr("%s.vert", shaderName));

            var frag = require(cc.js.formatStr("%s.frag", shaderName));

            glProgram.initWithString(vert, frag);

            if (!cc.sys.isNative) {  

                glProgram.initWithVertexShaderByteArray(vert, frag);

                glProgram.addAttribute(cc.macro.ATTRIBUTE_NAME_POSITION, cc.macro.VERTEX_ATTRIB_POSITION);  

                glProgram.addAttribute(cc.macro.ATTRIBUTE_NAME_COLOR, cc.macro.VERTEX_ATTRIB_COLOR);  

                glProgram.addAttribute(cc.macro.ATTRIBUTE_NAME_TEX_COORD, cc.macro.VERTEX_ATTRIB_TEX_COORDS);  

            }

            glProgram.link();  

            glProgram.updateUniforms();

            this.shaderPrograms[shaderName] = glProgram;

        }

        sprite._sgNode.setShaderProgram(glProgram);

        return glProgram;

    },

};



module.exports = ShaderUtils;

 

var ShaderUtils = require("ShaderUtils");

cc.Class({

    extends: cc.Component,



    properties: {

        sp: cc.Sprite,

    },



    onLoad : function(){



        this._time = 0;



        this._sin = 0;



        this._program = ShaderUtils.setShader(this.sp, "circle");



    },

    

    

    onSliderChange(slider, eventType) {

        this.edge = Number((slider.progress / 2).toFixed(2));

        if (!this._program ) return;

        this._program .use();

        if (cc.sys.isNative) {

            var glProgram_state = cc.GLProgramState.getOrCreateWithGLProgram(this.program);

            glProgram_state.setUniformFloat("u_edge", this.edge);

        } else {

            let ed = this._program .getUniformLocationForName("u_edge");

            this._program .setUniformLocationWith1f(ed, this.edge);

        }



    }

});



感謝關注個人博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章