あおみかんのブログ

フリーランスのIT系エンジニア。ゲーム制作スタジオ4th cluster代表。

cocos2d-x メモ 2016/06/02

ほぼ個人的なcocos2d-xのお勉強メモだけど、誰かの役にも立ちそうなのでブログに載せとく。

BlendFunc

BlendFuncというのを使うと、Photoshopとかにある乗算レイヤとか加算レイヤとかスクリーンレイヤとかと似たような事が出来るらしい。 そもそもがOpenGL ESのAlphaBlending機能なので、それに関する情報を漁れば色々出て来る。

# 加算
BlendFunc blend;
blend.src = GL_SRC_ALPHA;
blend.dst = GL_ONE;

# 乗算
BlendFunc blend;
blend.src = GL_DST_COLOR;
blend.dst = GL_ZERO;

# 乗算別バージョン (結果は一緒になる)
BlendFunc blend;
blend.src = GL_ZERO;
blend.dst = GL_SRC_COLOR;

ようは、srcが対象のNodeで、dstが親(+兄ノード? 事前にレンダリングされてるものだと思うんだよな)のことで、 blendfuncでの指定をそれぞれの色に乗じて和を取るってことみたい。

疑似的にはたぶん、こういうこと。

render.pixel = child.pixel * blend.src + parent.pixel * blend.dst;

RenderTexture

あらゆるNodeをスクリーンショット的に一度レンダリングして使い回せるようにするやつ。 メソッド一覧を見てたらどうやらファイルへの書き出しも出来るっぽいので、スクリーンショットSNSに投稿する機能とかにも使われてるやつだと思う。

RenderTexture *texture = RenderTexture::create(visibleSize.width, visibleSize.height);
texture1->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
texture->beginWithClear(0, 0, 0, 1);
sprite->visit();
texture->end();

visitが重要。 これでspriteのレンダリングを実行してくれる。 beginWithClearはvisit直前のキャンバスクリアみたいなやつだろう。

このtextureを使ってSpriteを作る事も出来る。

Sprite *sprite2 = Sprite::createWithTexture(texture->getSprite()->getTexture());
sprite2->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
sprite2->setFlippedY(true);

※ 手元のコード見たら setFlippedY つけてたけど、必要なのかはよく分かってないです。。

特にDrawNodeとかはそのままだと扱いにくいことがある(どうもBlendFuncと相性が悪い)ので、一度RenderTextureにしちゃってからBlendすると結構期待通りに動く。 恐らくGPUだけで完結するはずのものが一回CPUに回ってくる処理になっちゃうので、updateの中でぐりぐり動くようなのを作りたい場合はパフォーマンスに気をつけないとFPSが保てないと思う。 initの中で最初だけ作ってあとは使い回すとかなら問題少なそうだし積極的に使って行きたいな。

GLSLとsetGLProgram

まだ詳細が分かってないんだけど、C言語を拡張したようなGLSLっていう言語でシェーダプログラミングが出来るらしい。 これはWebGLを含むかなり色々な環境で動く言語のようで、汎用性が高い技術みたい。 アニメーションもヌルヌルかけるので、cocos2d-xのレイヤで書くべき部分とシェーダで書くべき部分の目利きが出来るとよさそう。ある程度は推測がつくけど、やっぱ詳細が分からないので意外な盲点がありそうな感じがする。