こんにちは
OF触り始めて1年が経とうとしている者です。
ようやくプログラムがどういうもので何ができるのか少しつかみ始めた程度のど素人です。
そんなど素人が1年触ってみて、つまづいた点や便利だなと思った点をど素人なりにど素人にまとめていこう、ということで初記事になります。生暖かい目で見守ってください。
#ofFboってなんぞや
ofFboってなんだ?そう、Fboとか言われてもピンときません。
Fboとはフレームバッファーオブジェクトの略で、簡単に言えばバッファをひとまとめに保持できるものです。うん、ピンときません。
要は画像とか動画とかをメモリに置いていつでも取り出せる状態にするようなもんです。
本当はもっと複雑なんですが、最初はそんな理解なくて大丈夫だと思います。理論より先に使って慣れろです!(よくわかってない)
#使ってみよう
ヘッダーファイルに宣言!
ofFbo fbo;
続いてcppファイル!
void ofApp::setup(){
//setup関数内でまず使用する領域を確保する
fbo.allocate(横幅サイズ, 縦幅サイズ);
}
はいでました。最初のポイント、allocate関数です。日本語訳で"割り振り"ですね。ofImageとかにもあります。
要は「この枠分使いたいですよ」という宣言を先にしてあげないといけません。
ちなみに第三引数でフォーマットを選べますが最初は無視していいと思います。デフォルトでGL_RGBAというアルファチャンネル(透明度あり)の状態になっているので。
もしフォーマットも指定するならこんな感じ
//アルファチャンネル無し設定
fbo.allocate(横幅, 縦幅, GL_RGB);
//アルファチャンネルあり設定(デフォルトはこれ)
fbo.allocate(横幅, 縦幅, GL_RGBA);
//Rチャンネルのみ
fbo.allocate(横幅, 縦幅, GL_R);
という感じです。"GL_"と打つと候補がかなり多く出てきますので色々試してみてください。ただ全部が全部使えるわけじゃないのでご注意を。面倒くさそうだったら気にしないでください(笑)
続いてupdate関数。
void ofApp::update(){
fbo.begin();
ofClear(0);//重要!
//ここにひとまとめで描画させたい項目を記述
ofSetColor(255,0,0);
ofDrawRectangle(0, 0, 100, 100);
ofSetColor(0,255,0);
ofDrawRectangle(0, 200, 100, 100);
ofSetColor(0,0,255);
ofDrawRectangle(200,0 , 100, 100);
fbo.end();
}
draw系の記述をupdate関数に記述してもいいの?と思われるかもしれませんが、OFの作法なのかこちらが一般的な感じがします。sampleでもupdate関数内に書かれています。
さて、重要と書かれたofClear()という関数に気付かれましたか?重要です。
これを宣言してあげないともし動画や動くものを描画した場合どんどん上書きで描画されて見た目が大変なことになります。
そして最後、draw関数。
//draw(描画するx軸,描画するy軸,サイズx,サイズy);
fbo.draw(0, 0, ofGetWidth(), ofGetHeight());
以上です!簡単ですね^ - ^
これでfbo.begin()とfbo.end()内に記述したものを一括で扱えるようにようになりました。
試しにx軸とy軸の値を変更して描画位置を変えてみたりサイズを変更してグニャグニャ動かしてみてください。
#主な用途
使用するメリットとしては最初で言ったように描画されているものをひとまとめで画像と同じように扱えることです。
これを使えば好きな画像や動画、円や四角、パーティクルなどもすべて一つにまとめて扱えます。まとめてサイズを変更したり縦横比を変えてみたりgetTexture関数でtextureとして扱ったり。
僕がよくするのはクロスフェードさせるときに出したいものと消したいものを別々のfboにまとめて互いをフェードイン、フェードアウトさせたりしています。
ただ結構FBOって重い処理らしいので調子に乗って使いまくるのはご注意を...。
良いプログラミングライフを!