FrameBufferObject(FBO)

SAMPLE https://www.dropbox.com/s/xaxhunu3yhv6eby/fbo.exe( フレームバッファオブジェクト ) 初期化時に FrameBufferObject を作成する
App::onInit() { // フレームバッファオブジェクトを作成する glGenFramebuffersEXT( 1, idFbo ); // fbo にアタッチするテクスチャオブジェクトを作成する glGenTextures( 1, idTex ); glGenTextures( 1, idDepth ); // カラーバッファ glBindTexture( GL_TEXTURE_2D, idTex ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); WARNING // fbo に利用するテクスチャも 初期化の設定を正しく設定しないと // 2パス目の描画でバインドしたときに正しく描画されない { glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexEnvf ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); } // 深度バッファを作成 glBindTexture( GL_TEXTURE_2D, idDepth ); glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL ); // テクスチャをフレームバッファオブジェクトにバインド glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, idFbo ); glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, idTex, 0 ); glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, idDepth, 0 ); // デフォルトのレンダーターゲットに戻す glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); }
1パス目の描画で FrameBufferObject に描画する。 2パス目でその結果をバインドしたテクスチャを利用する。
App::onDraw() { // バッファを変更 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, idfbo ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // ハコを描画 drawCube(); // 描画した結果を利用して 2 パス目を描画 // デフォルトのレンダーターゲットに戻し、ディスプレイに描画 glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glBindTexture( GL_TEXTURE_2D, idTex ); drawCube(); }



glBindFramebufferEXT

SYNTAX void glBindFramebuffer( GLenum target, // GL_DRAW_FRAMEBUFFER | GL_READ_FRAMEBUFFER | GL_FRAMEBUFFER GLuint framebuffer // FrameBufferObject の ID ); DESC FrameBuffer で指定した fbo を target に設定する。 target は 3つのいずれかひとつ。 GL_DRAW_FRAMEBUFFER 描画の対象になる GL_READ_FRAMEBUFFER テクスチャへの読み込み処理の対象にする
// target に GL_FRAMEBUFFER を指定すると, 描画( draw ) と テクスチャへの読み込み( read )の両対応になる // fbo オブジェクトは glGenFramebuffers() で作成する POINT // 0 を指定すると fbo オブジェクトの設定を解除する // デフォルトに戻すときは必ずコールすること glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );



glGenFramebuffers

SYNTAX void glGenFramebuffers( GLenum target, // GL_DRAW_FRAMEBUFFER | GL_READ_FRAMEBUFFER | GL_FRAMEBUFFER GLuint framebuffer // FrameBufferObject の ID );


glFramebufferTexture

void glFramebufferTexture2D( GLenum target, GLenum attachment, // FrameBufferObject へバインドする場所 GLenum textarget, // アタッチするテクスチャオブジェクトのタイプ GLuint texture, // Specifies the texture object to attach to the framebuffer attachment point named by attachment. // アタッチ(設定)する TextureObject GLint level // アタッチする TextureObject のミップマップレベルの指定 ); DESC attach a level of a texture object as a logical buffer to the currently bound framebuffer object glFramebufferTexture, glFramebufferTexture1D, glFramebufferTexture2D, attach a selected mipmap level or image of a texture object as one of the logical buffers of the framebuffer object currently bound to target. target must be GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_FRAMEBUFFER. GL_FRAMEBUFFER is equivalent to GL_DRAW_FRAMEBUFFER. attachment で FrameBufferObject のどこにテクスチャをバインドするか指定する 次のいずれか GL_COLOR_ATTACHMENTi, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT GL_DEPTH_STENCIL_ATTACHMMENT. i in GL_COLOR_ATTACHMENTi は以下の範囲 [ 0 : GL_MAX_COLOR_ATTACHMENTS - 1 ] Attaching a level of a texture to GL_DEPTH_STENCIL_ATTACHMENT is equivalent to attaching that level to both the GL_DEPTH_ATTACHMENT and the GL_STENCIL_ATTACHMENT attachment points simultaneously. textarget specifies what type of texture is named by texture, and for cube map textures, specifies the face that is to be attached. If texture is not zero, it must be the name of an existing texture with type textarget, // cubemap でなければ unless it is a cube map texture, in which case textarget must be GL_TEXTURE_CUBE_MAP_POSITIVE_X GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, or GL_TEXTURE_CUBE_MAP_NEGATIVE_Z. texture If texture is non-zero, the specified level of the texture object named texture is attached to the framebfufer attachment point named by attachment. For glFramebufferTexture1D, glFramebufferTexture2D, and glFramebufferTexture3D, texture must be zero or the name of an existing texture with a target of textarget, or texture must be the name of an existing cube-map texture and textarget must be one of GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, or GL_TEXTURE_CUBE_MAP_NEGATIVE_Z.