送福利,ImageView变灰方案

//先把代码粘上去,有空仔细编辑下
说白了,就是先把ImageView向texture渲染一下,再把RenderTexture的纹理取出来,放在自己写的灰度精灵里。而后再渲染到RenderTexture里。之后调用ImageView的getVirtureRender。把它强转为CCSprite,而后调用initWithTexture。ImageView变灰就完成了。
3.x的小伙伴们,要记住渲染队列这个东西,rtt需要设置成成员变量,初始化的时候retain一下,不然会被释放。
大神们可能感觉这东西比较白痴,但对于我们这样刚毕业的程序猿来说,这还是很有用的。
至少,当时我为这问题纠结了好久。
CCSize btnDrawAwardSize = m_btnDrawAward->getSize();
CCPoint btnDrawAwardPoint = m_btnDrawAward->getPosition();

    m_btnDrawAward->setPosition(m_btnDrawAward->getContentSize()/2.0f);
    m_btnDrawAward->setScaleY(-1.0f);
    CCRenderTexture *rtt = CCRenderTexture::create(btnDrawAwardSize.width, btnDrawAwardSize.height);
    rtt->getSprite()->getTexture()->setAntiAliasTexParameters();
    rtt->begin();
    m_btnDrawAward->visit();
    rtt->end();
    m_btnDrawAward->setPosition(btnDrawAwardPoint);
    m_btnDrawAward->setScaleY(1.0f);
    m_btnDrawAward->setVisible(false);
    ImageView *grayBtn = ImageView::create();
    grayBtn->setSize(btnDrawAwardSize);
    grayBtn->setPosition(btnDrawAwardPoint);
    CCSprite *imgGraySprite = dynamic_cast<CCSprite*>(grayBtn->getVirtualRenderer());
    CCTexture2D *renderedTexture = rtt->getSprite()->getTexture();
    GraySprite *graySprite  = GraySprite::create(renderedTexture);
    //CCSprite *graySprite  = CCSprite::createWithTexture(renderedTexture);
    graySprite->setPosition(graySprite->getContentSize()/2.0f);
    graySprite->setScaleY(-1.0f);
    CCSize contentSize = graySprite->getContentSize();
    CCRenderTexture *rtt1 = CCRenderTexture::create(contentSize.width,contentSize.height);
    rtt1->getSprite()->getTexture()->setAntiAliasTexParameters();
    rtt1->begin();
    graySprite->visit();
    rtt1->end();
    imgGraySprite->initWithTexture(rtt1->getSprite()->getTexture());
    ///imgGraySprite->initWithTexture(renderedTexture);
    //imgGraySprite->setShaderProgram(getGrayShader());
    addChild(grayBtn);

绘制灰度精灵是一种解决方案。:856::856:
还有另外一种比较常见的解决方案是用着色器来处理。

楼主可以对比下

恩,版主说的没错,直接getVirtualRender()->setShaderProgram()更方便点。
还可以在ShaderProgramCatch里预先加载好一个灰色的shader。
这代码是俩月前写的,当时没想到。
今天搞cocostudio2,逛论坛,顺便发上来共享下。
不过我这种方法,可以把整个图片变灰(我们那里图片的背景和前景,以及上面的文字,图标,是拆开的),不用一个一个set了。
不过要把原来的setVisible(false);加个新的上去。