精灵变灰效果

本文介绍了一种使用 Cocos2d-x 实现图片灰度效果的技术方案,通过自定义精灵类 BYGraySprite 并重写其初始化及绘制方法,实现了将普通图片转换为灰度图片的功能。此外,还提供了恢复图片正常颜色的方法。

转自:http://blog.youkuaiyun.com/u012945598/article/details/19898609




BYGraySprite.h:

#include "cocoa/CCGeometry.h"

#include "cocos2d.h"

USING_NS_CC;


class BYGraySprite : public CCSprite{

    

public:

    BYGraySprite();

    virtual ~BYGraySprite();

    static BYGraySprite* create(const char* pszFileName);//创建一个变灰的精灵

    bool initWithTexture(CCTexture2D* pTexture, const CCRect& tRect);

    virtual void draw();

    

    void enableSprite(CCSprite* sp); //恢复正常颜色的方法

};


BYGraySprite.cpp:

#include "BYGraySprite.h"


BYGraySprite::BYGraySprite(){

    

}


BYGraySprite::~BYGraySprite(){

    

}


BYGraySpriteBYGraySprite::create( const char* pszFileName ){

    BYGraySprite* graySprite = new BYGraySprite;

    if (graySprite && graySprite->initWithFile(pszFileName)){

        graySprite->autorelease();

        return graySprite;

    }else{

        CC_SAFE_RELEASE(graySprite);

        return NULL;

    }

}


bool BYGraySprite::initWithTexture(CCTexture2D* pTexture, const CCRect& tRect ){

    do{

        CC_BREAK_IF(!CCSprite::initWithTexture(pTexture, tRect));

        

        GLchar* pszFragSource =

        "#ifdef GL_ES \n \

        precision mediump float; \n \

        #endif \n \

        uniform sampler2D u_texture; \n \

        varying vec2 v_texCoord; \n \

        varying vec4 v_fragmentColor; \n \

        void main(void) \n \

        { \n \

        // Convert to greyscale using NTSC weightings \n \

      vec4 col = texture2D(u_texture, v_texCoord);  float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114));  gl_FragColor = vec4(grey, grey, grey, col.a);   \n \

        }";

        

        CCGLProgram* pProgram = new CCGLProgram();

        pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, pszFragSource);

        this->setShaderProgram(pProgram);

        pProgram->release();

        CHECK_GL_ERROR_DEBUG();

        

        this->getShaderProgram()->addAttribute(kCCAttributeNamePositionkCCVertexAttrib_Position);

        this->getShaderProgram()->addAttribute(kCCAttributeNameColorkCCVertexAttrib_Color);

        this->getShaderProgram()->addAttribute(kCCAttributeNameTexCoordkCCVertexAttrib_TexCoords);

        CHECK_GL_ERROR_DEBUG();

        

        this->getShaderProgram()->link();

        CHECK_GL_ERROR_DEBUG();

        

        this->getShaderProgram()->updateUniforms();

        CHECK_GL_ERROR_DEBUG();

        

        return true;

    } while (0);

    return false;

}


void BYGraySprite::draw(){

    ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex );

    ccGLBlendFuncm_sBlendFunc.srcm_sBlendFunc.dst );

    

    this->getShaderProgram()->use();

    this->getShaderProgram()->setUniformsForBuiltins();

    

    ccGLBindTexture2Dthis->getTexture()->getName() );

    

#define kQuadSize sizeof(m_sQuad.bl)

    long offset = (long)&m_sQuad;

    

    // vertex

    int diff = offsetofccV3F_C4B_T2Fvertices);

    glVertexAttribPointer(kCCVertexAttrib_Position3GL_FLOATGL_FALSEkQuadSize, (void*) (offset + diff));

    

    // texCoods

    diff = offsetofccV3F_C4B_T2FtexCoords);

    glVertexAttribPointer(kCCVertexAttrib_TexCoords2GL_FLOATGL_FALSEkQuadSize, (void*)(offset + diff));

    

    // color

    diff = offsetofccV3F_C4B_T2Fcolors);

    glVertexAttribPointer(kCCVertexAttrib_Color4GL_UNSIGNED_BYTEGL_TRUEkQuadSize, (void*)(offset + diff));

    glDrawArrays(GL_TRIANGLE_STRIP04);

    CC_INCREMENT_GL_DRAWS(1);

}


void BYGraySprite::enableSprite(CCSprite* sp)

{

    const GLchar* pszFragSource =

    "#ifdef GL_ES \n \

    precision mediump float; \n \

    #endif \n \

    uniform sampler2D u_texture; \n \

    varying vec2 v_texCoord; \n \

    varying vec4 v_fragmentColor; \n \

    void main(void) \n \

    { \n \

    // Convert to greyscale using NTSC weightings \n \

    vec4 col = texture2D(u_texture, v_texCoord); \n \

    gl_FragColor = vec4(col.r, col.g, col.b, col.a); \n \

    }";

    CCGLProgram* pProgram = new CCGLProgram();

    pProgram->initWithVertexShaderByteArray(ccPositionTextureColor_vert, pszFragSource);

    sp->setShaderProgram(pProgram);

    pProgram->release();

    sp->getShaderProgram()->addAttribute(kCCAttributeNamePositionkCCVertexAttrib_Position);

    sp->getShaderProgram()->addAttribute(kCCAttributeNameColorkCCVertexAttrib_Color);

    sp->getShaderProgram()->addAttribute(kCCAttributeNameTexCoordkCCVertexAttrib_TexCoords);

    sp->getShaderProgram()->link();

    sp->getShaderProgram()->updateUniforms();

}


在HelloWorld.cpp中测试代码:

    BYGraySprite* graySprite = BYGraySprite::create("stone.png");

    graySprite->setPosition(ccp(480,400));

    //graySprite->enableSprite(graySprite); 恢复颜色的方法

    this->addChild(graySprite);

  

    CCSprite * sprite=CCSprite::create("stone.png");

    sprite->setPosition(ccp(graySprite->getPositionX(), graySprite->getPositionY()-200));

    this->addChild(sprite);


源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值