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

fbo.png

テクスチャの準備

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);

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

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);

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

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);

FBOに色を割り当てる

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

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

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);

サポートサイト Wikidot.com