cocos2dx3.2@Live2Dでポストエフェクト その2

グレア効果を試してみた。
背景が明るいと若干見にくいので、ここら辺はまだ何とかできないか模索中。
また、上のキャプチャはPCで撮ったものなので、速度は60fps出ているけれど、
スマホだとモデル一体で30fps強くらいまで落ちるので、もう少し高速化も必要。

描画部分はcocos2d-xの処理はほとんど使わず、FBOに繰り返し
glDrawArrays()しながら画像を加工してる。cocos2d-x3.xのdraw()には、
関数を呼んだ瞬間に描画をするのではなく、描画要求をキューに登録させて、
いい具合にソートしてから一括処理してくれる親切機能があるのだけど、
これがFBOへのglDrawArrays()と相性がよくないようなので、draw()の中で
_customCommandからonDraw()を直接呼ぶように処理を変更する必要があった。
相手が良かれと思ってやってくれていることがこちらの都合と合致しないという、
悲しみの実装となっている。コードはこんな感じ。

void Hoge::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){
    Size frameSize = CCDirector::sharedDirector()->getOpenGLView()->getFrameSize();
    m_renderTexture->beginWithClear(0, 0, 0, 0);
    _customCommand.init(_globalZOrder);
    _customCommand.func = CC_CALLBACK_0(Hoge::onDraw, this, transform, flags);
    renderer->addCommand(&_customCommand);
    m_renderTexture->end();
    glViewport(0, 0, frameSize.width, frameSize.height);
    m_renderTexture->visit(renderer, transform, flags);
}
void Hoge::onDraw(const cocos2d::Mat4 &transform, uint32_t flags){
    //略
    glDrawArrays();
    //略
}

グレア部分に関しては偉い人のスライドを参考にした。
http://www.daionet.gr.jp/~masa/archives/GDC2003_DSTEAL.ppt
http://www.daionet.gr.jp/~masa/archives/GDC2004/GDC2004_PIoHDRR_JP.ppt
http://www2.ati.com/developer/ScenePostProcessing.pps

シェーダを使い始めた頃に普通のgaussian blurを試してみたら
スマホ実機では重過ぎて爆死した覚えがあるのだけど、
上のスライドの方法でやったら実用レベルまで速度は出た。凄い。

輝度部分の抽出についてはシェーダ側で色濃度を見るのではなく、
Live2D側のsetPartsOpacity()の切り替えでパーツを抜き出している。
モデルの作りによってはテクスチャの前後関係が増えて
処理が重くなる可能性があるので、ここら辺も改善の余地があるかも知れない。