オフスクリーンレンダリングして画像書き出し

旧ブログの同名の記事を書き直したものです。

オフスクリーンレンダリングして画像書き出し-TIPS

旧記事では古い OpenGL に関して書きましたが、今回の記事は OpenGL 3.3 以降で使えるはずです。といっても、ほとんど違いはなく関数名、定数名から EXT を外すだけですが。

今回もまた大雑把なやり方だけ記します。

グローバル変数

frame buffer と render buffer のインデックスをそれぞれ fbID, rbID とする。書き出したい画像のサイズを FB_WIDTH, FB_HIGHT とする。

GLuint fbID, rbID;
int FB_WIDTH, FB_HEIGHT;

初期化

glewInit();

// renderbuffer object の生成
glGenRenderbuffers( 1, &rbID );
glBindRenderbuffer( GL_RENDERBUFFER, rbID );

// 第二引数は 色 GL_RGB, GL_RGBA, デプス値 GL_DEPTH_COMPONENT, ステンシル値 GL_STENCIL_INDEX などを指定できる
glRenderbufferStorage( GL_RENDERBUFFER, GL_RGBA, FB_WIDTH, FB_HEIGHT ); 

// framebuffer object の生成
glGenFramebuffers( 1, &fbID );
glBindFramebuffer( GL_FRAMEBUFFER, fbID );

// renderbufferをframebuffer objectに結びつける
// 第二引数は GL_COLOR_ATTACHMENTn, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT など
glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbID );

glBindFramebuffer( GL_FRAMEBUFFER, 0 );

Display 関数内で

// fbo 有効化
glBindFramebuffer( GL_FRAMEBUFFER, fbID );
glDrawBuffer(GL_COLOR_ATTACHMENT0);

// 通常の描画...

// 読み込むバッファを選ぶ
glReadBuffer(GL_COLOR_ATTACHMENT0);

// glReadPixels を用いて画像を保存する処理...

// fbo 無効化
glBindFramebuffer( GL_FRAMEBUFFER, 0);

その他

オフスクリーンなのでウインドウを出さずにやりたいのですが、そのやり方はいまだに不明です。OpenGL の初期化自体ができないので。しょうがないので小さなウインドウ(100×1)を出してやっています。

この記事が旧ブログからの初めての移転記事になりますが、全部やるつもりはないのでいくつか選んで移転するつもりです。