基于cocos2dx openGL ES 实现的动画批处理shader

 

下面是一个基于cocos2dx OpenGL ES 实现的动画批处理 Shader:

 

#ifndef __Game__CCMyShader__

#define __Game__CCMyShader__

using namespace cocos2d;

class CCMyShader

{

public:

      static void initSharder()

    {

        initSharder_normal();

        initSharder_alpha();

    }

    

private:

    static void initSharder_normal()

    {

        const char* frag1 =

        "                                   \n\

        #ifdef GL_ES                        \n\

        precision lowp float;               \n\

        #endif                              \n\

        varying vec4 v_fragmentColor;       \n\

        varying vec2 v_texCoord;            \n\

        uniform vec4 u_color;               \n\

        void main()                         \n\

        {                                   \n\

        gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord) * u_color;    \n\

        }";

        

        auto p1 = new GLProgram();

        p1->initWithByteArrays(ccPositionTextureColor_vert, frag1);

        //p1->initWithByteArrays(ccPositionTextureColor_vert, ccPositionTextureColor_frag);

        

        GLProgramCache::getInstance()->addGLProgram(p1, "animation_shader");

        

        

        CHECK_GL_ERROR_DEBUG();

        

        p1->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);

        p1->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);

        p1->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);

        

        CHECK_GL_ERROR_DEBUG();

        

        p1->link();

        

        CHECK_GL_ERROR_DEBUG();

        

        p1->updateUniforms();

        

        CHECK_GL_ERROR_DEBUG();

    }

    

    static void initSharder_alpha()

    {

        const char* frag2 =

        "                                   \n\

        #ifdef GL_ES                        \n\

        precision lowp float;               \n\

        #endif                              \n\

        varying vec4 v_fragmentColor;       \n\

        varying vec2 v_texCoord;            \n\

        uniform vec4 u_color;               \n\

        void main()                         \n\

        {                                   \n\

        gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord) * u_color * v_fragmentColor.a;    \n\

        }";

        

        auto p2 = new GLProgram();

        p2->initWithByteArrays(ccPositionTextureColor_vert, frag2);

        GLProgramCache::getInstance()->addGLProgram(p2, "animation_shader_alpha");

        

        

        CHECK_GL_ERROR_DEBUG();

        

        p2->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);

        p2->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);

        p2->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);

        

        CHECK_GL_ERROR_DEBUG();

        

        p2->link();

        

        CHECK_GL_ERROR_DEBUG();

        

        p2->updateUniforms();

        

        CHECK_GL_ERROR_DEBUG();

        

    }

    

    static void initSharder_lighten()

    {

        const char* frag2 =

        "                                   \n\

        #ifdef GL_ES                        \n\

        precision lowp float;               \n\

        #endif                              \n\

        varying vec4 v_fragmentColor;       \n\

        varying vec2 v_texCoord;            \n\

        uniform vec4 u_color;               \n\

        void main()                         \n\

        {                                   \n\

        gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord) * u_color * v_fragmentColor.a;    \n\

        }";

        

        auto p2 = new GLProgram();

        p2->initWithByteArrays(ccPositionTextureColor_vert, frag2);

        GLProgramCache::getInstance()->addGLProgram(p2, "animation_shader_lighten");

        

        

        CHECK_GL_ERROR_DEBUG();

        

        p2->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);

        p2->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);

        p2->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);

        

        CHECK_GL_ERROR_DEBUG();

        

        p2->link();

        

        CHECK_GL_ERROR_DEBUG();

        

        p2->updateUniforms();

        

        CHECK_GL_ERROR_DEBUG();

        

    }

    

};

 

#endif /* defined(__Game__CCMyShader__) */

 

如有错误,大家可以一起交流

 联系方式 qq: 940299880

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值