精灵变灰效果

本文介绍了一种使用 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/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值