cocos2d-x一个函数实现精灵变灰效果

本文介绍了一个用于Cocos2d-x游戏开发中实现图像灰度显示的方法。通过自定义着色器和GLProgram来改变节点的颜色输出,从而达到灰度效果。适用于Cocos2d-x 3.2版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cocos2d-x版本:3.2

代码如下:

void XCommon::makeGrey(Node *node, bool grey)
{
    if (nullptr == node)
    {
        return;
    }


    if (grey)
    {
        static const char *grayProgramKey = "ShaderPositionTextureGray";


        GLProgram *pProgram  = GLProgramCache::getInstance()->getGLProgram(grayProgramKey);
        if (nullptr == pProgram)
        {
            const GLchar *vertDefaultSource = 
                "attribute vec4 a_position; \n" \
                "attribute vec2 a_texCoord; \n" \
                "attribute vec4 a_color; \n" \
                "#ifdef GL_ES \n" \
                "varying lowp vec4 v_fragmentColor;\n" \
                "varying mediump vec2 v_texCoord;\n" \
                "#else \n" \
                "varying vec4 v_fragmentColor; \n" \
                "varying vec2 v_texCoord;  \n" \
                "#endif \n" \
                "void main() \n" \
                "{\n" \
                "gl_Position = CC_PMatrix * a_position; \n" \
                "v_fragmentColor = a_color;\n" \
                "v_texCoord = a_texCoord;\n" \
                "}";
            const GLchar *pszFragSource  = 
                "#ifdef GL_ES \n" \
                "precision mediump float; \n" \
                "#endif \n" \
                "varying vec4 v_fragmentColor; \n" \
                "varying vec2 v_texCoord; \n" \
                "void main(void) \n" \
                "{ \n" \
                "vec4 c = texture2D(CC_Texture0, v_texCoord); \n" \
                "gl_FragColor.xyz = vec3(0.4*c.r + 0.4*c.g +0.4*c.b); \n" \
                "gl_FragColor.w = c.w; \n" \
                "}";


            pProgram = GLProgram::createWithByteArrays(vertDefaultSource, pszFragSource);
            if (nullptr == pProgram)
            {
                return;
            }


            pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
            pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
            pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
            pProgram->updateUniforms();
            GLProgramCache::getInstance()->addGLProgram(pProgram, grayProgramKey);
        }


        node->setGLProgram(pProgram);
    }
    else
    {
        node->setGLProgram(GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP));
    }
}

表现效果如图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值