2015年12月22日火曜日

cocos2d-x CCRenderTextureでゲーム中のスクショを撮るときの注意点

どうも、俺です。

cocos2d-x (v2.2.6)でTwitter投稿用に画面のキャプチャを撮る処理を実装
したのですが、
キャプチャした時にCCParticleSystemでパーティクルを表示していると画面が真っ黒になってしまう問題に遭遇しました。
※すべてのパーティクルでなる訳ではありません。むしろ一部のパーティクルでのみ発生。
※iOSでのみ確認しましたが、恐らくAndroidでも同様のはず..。


赤いプレイヤーのうしろにある炎がパーティクルです。

キャプチャーの撮影処理は、
CCRenderTexture *AppDelegate::takePicture()
{
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    CCRenderTexture *texture = CCRenderTexture::create((int)size.width,
                                                       (int)size.height,
                                                       kCCTexture2DPixelFormat_RGBA8888,
                                                       GL_DEPTH24_STENCIL8_OES);
    
    texture->setPosition(ccp(size.width * 0.5f, size.height * 0.5f));
    
    texture->begin();
    CCDirector::sharedDirector()->getRunningScene()->visit();
    texture->end();
    
    return texture;
}
のように処理しています。

この処理のままパーティクル描画ある画面をキャプチャすると、、

このように、パーティクル部分が黒くなってしまいます。

これは利用している炎のパーティクルのccBlendFunctionを変更することで対応できます。
今回の場合は、
    ccBlendFunc blend;
    blend.src = GL_ONE_MINUS_SRC_ALPHA;
    blend.dst = GL_ONE;
    _myFireParticle->setBlendFunc(blend);
    
    CC_SAFE_RELEASE_NULL(_screenShot);
    CCRenderTexture *screenShot = AppDelegate::takePicture();
    CC_SAFE_RETAIN(_screenShot);
    
    blend.src = GL_ONE_MINUS_SRC_ALPHA;
    blend.dst = GL_DST_ALPHA;
    _myFireParticle->setBlendFunc(blend);

このようにすることで対応できました。
※_myFireParticleは炎のCCParticleSystemインスタンス。

利用するccBlendFuncは、元のパーティクルが崩れない最も適したもので色々試してみてください。


以上でぇぇぇぇぇぇぇぇす。

0 件のコメント: