Sprite* HelloWorld::maskedSpriteWithSprite(Sprite* textureSprite, Sprite* maskSprite)
{
// 1
RenderTexture * rt = RenderTexture::create( maskSprite->getContentSize().width,
maskSprite->getContentSize().height );
// 2
maskSprite->setPosition(maskSprite->getContentSize().width/2,
maskSprite->getContentSize().height/2);
textureSprite->setPosition(textureSprite->getContentSize().width/2,
textureSprite->getContentSize().height/2);
// 3
maskSprite->setBlendFunc( BlendFunc{GL_ONE, GL_ZERO} );//这句话可以去掉
textureSprite->setBlendFunc( BlendFunc{GL_DST_ALPHA, GL_ZERO} );
// 4
rt->begin();
maskSprite->visit();
textureSprite->visit();
rt->end();
// 5
Sprite *retval = Sprite::createWithTexture(rt->getSprite()->getTexture());
retval->setFlippedY(true);
return retval;
}
原理:
* 把src color(日历)设置为GL_DST_ALPHA。意思是,看看mask图片的当前alpha值是多少,如果是0(完全透明),那么就显示mask的。如果是1(完全不透明),那么就显示日历图片。
* 然后把dst color(the mask)设计成GL_ZERO,这样的话,之前渲染上去的mask就消失了。
缺点:
* 每一次你应用一次mask的时候,都会在内存里面创建一张额外的纹理图片。 在iphone上面纹理所能占用的内存数量是非常有限的,所以你要非常小心,尽可能减少内存中加载的纹理图片数量。当你一次只给一张图片加mask效果的时候,这种方法很好,但是100张图片需要mask呢?
* 渲染非常耗时.使用RenderTexture来渲染代价非常高,尤其是当纹理大小变大以后。如果你经常使用这种方式去绘图,那么会严重影响性能。