精灵变灰效果

本文介绍了一种使用 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);


【SCI一区论文复】基于SLSPC系列的高阶PT-WPT无线电能传输系统研究(Matlab代码实现)内容概要:本文围绕“基于SLSPC系列的高阶PT-WPT无线电能传输系统研究”展开,重点复现SCI一区论文中的核心技术,通过Matlab代码实现高阶无线电能传输系统的建模与仿真。研究聚焦SLSPC拓扑结构在恒压-恒流(CV/CC)输出特性方面的优势,深入分析系统的传输效率、耦合特性、频率分裂现象及参数敏感性,并探讨其在高功率、长距离无线充电场景中的应用潜力。文中详细给出了系统数学建模、参数设计、仿真验证等关键步骤,旨在帮助读者掌握先进无线电能传输技术的核心原理与实现方法。; 适合人群:具备一定电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事无线电能传输、新能源充电技术等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解SLSPC型无线电能传输系统的恒压恒流输出机理;②掌握高阶WPT系统的建模、仿真与性能分析方法;③复现SCI一区论文成果,为后续科研创新提供技术基础和代码参考;④应用于无线充电、电动汽车、植入式医疗设备等领域的系统设计与优化。; 阅读建议:建议读者结合Matlab代码逐段分析系统模型构建过程,重点关注谐振参数设计、传输特性仿真及效率优化策略,同时可拓展研究不同耦合条件下的系统行为,以深化对高阶WPT系统动态特性的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值