cocos2d-x Getting Screenshot with Blur
Utilize cocos2d-x ShaderTest under cpp-tests.
Using SpriteBlur class in the test, following code will add a screenshot with blur effect:
void GameLayer::screenshotBlur(float blurRadius, float blurSampleNum, int repeat)
{
Size winSize= Director::getInstance()->getWinSize();
// screenshot
auto rt1= RenderTexture::create(winSize.width, winSize.height, Texture2D::PixelFormat::RGBA8888);
rt1->begin();
this->visit();
rt1->end();
RenderTexture* rt= rt1;
for (int i= 0; i < repeat; i++)
{
// SpriteBlur
auto sp1= SpriteBlur::create(rt->getSprite()->getTexture(), Rect(Vec2::ZERO, winSize));
sp1->setAnchorPoint(Vec2::ZERO);
sp1->setPosition(Vec2::ZERO);
sp1->setFlippedY(true);
sp1->setBlurRadius(blurRadius);
sp1->setBlurSampleNum(blurSampleNum);
// render blurred sprite
rt= RenderTexture::create(winSize.width, winSize.height, Texture2D::PixelFormat::RGBA8888);
rt->begin();
sp1->visit();
rt->end();
}
// final sprite
auto sp2= Sprite::createWithTexture(rt->getSprite()->getTexture());
sp2->setFlippedY(true);
sp2->setPosition(winSize/2);
sp2->setColor(Color3B(0x88, 0x88, 0x88));
this->addChild(sp2);
}
The basic idea is as following:
- Using RenderTexture , get current scene’s screenshot
- With SpriteBlur , apply blur effect on the screenshot
- Render the SpriteBlur to make a normal Texture
- Repeat
- Create a sprite with the texture of RenderTexture
- Add on the scene