フレームバッファーオブジェクト

最終更新日17 Dec 2017 05:42

テクスチャの準備

1 フレームバッファオブジェクトをしまっておく用のテクスチャを作る(まずは空で確保) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0);
2 デブス情報をしまっておくためのレンダーバッファを作る glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
3 フレームバッファオブジェクトを作る glGenFramebuffers(1, &fboId);

フレームバッファとテクスチャの関連づけ

5 FBOのIDをバインド glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFBOId);
4 作ったフレームバッファ3を1のテクスチャに渡す glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
5 2.をデブスバッファに渡す フレームバッファにレンダーバッファを装着する glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboId);
6 何個のカラーアタッチメントを使うか伝える glDrawBuffers(2,{GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1});

フレームバッファに書き込む

1 フレームバッファをバインドする glBindFramebuffer(GL_FRAMEBUFFER, fboId);
2 いままでdisplay()に書いていた手順のようにして書く。(glSwapBuffers()は要らない) glBegin(GLTRIANGLES)…など
3 でフレームバッファを解除する glBindFramebuffer(GL_FRAMEBUFFER, 0);

バッファの確保

//フレームバッファオブジェクトをしまっておく用のテクスチャを作る(まずは空で確保)
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0);
//テクスチャサンプラー設定
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
//テクスチャとフレームバッファを関連づける
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, textureId, 0);

1回に描画する時に格納したいバッファの枚数分、この手順を繰り返す。

glTexImage2D

どんな情報をしまっておきたいかによって使う引数が変わる
宣言
0~255 or floatは0.0-1.0 色値 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0);
float値なんでも格納したい場合 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, 0);
整数値 glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, width, height, 0, GL_RED_INTEGER, GL_SHORT, 0);

デプス情報をしまっておくためのレンダーバッファを作る

GLuint rboId;
glGenRenderbuffers(1, &rboId);
glBindRenderbuffer(GL_RENDERBUFFER, rboId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

Android,OpenGL ESの場合はGL_DEPTH_COMPONENTではなくGL_DEPTH_COMPONENT16にすること

フレームバッファオブジェクトを作る

GLuint fboId;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);

glBindFramebufferは何もしないデフォルトの描画の場合は
glBindFramebuffer(GL_FRAMEBUFFER,0);

になっている。
もし別個で特別なフレームバッファに書き込む場合にglGenFramebufferedで割り当てた番号をglBindFramebuffeする。

テクスチャとフレームバッファを関連づける

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,  GL_TEXTURE_2D, textureId, 0);

GL_COLOR_ATTACHMENT0の番号が違えば1回の描画で違う場所に書き込むことができる。

レンダーバッファにデプス情報を割り当てる

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,  GL_RENDERBUFFER, rboId);

FBOステータスのチェック

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE){ fboUsed = false;}

FBO書き込みモードにしてFBOに書き込む

//fbo書き込みモードON
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
// clear buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
// draw a scene to a texture directly
draw();
 
//FBO解除
glBindFramebuffer(GL_FRAMEBUFFER, 0);

作ったFBOをテクスチャとして貼りつける

// trigger mipmaps generation explicitly
// NOTE: If GL_GENERATE_MIPMAP is set to GL_TRUE, then glCopyTexSubImage2D()
// triggers mipmap generation automatically. However, the texture attached
// onto a FBO should generate mipmaps manually via glGenerateMipmap().
glBindTexture(GL_TEXTURE_2D, textureId);
glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

deferred


ファイル

サポートサイト Wikidot.com deferred