SAMPLE
フレームバッファオブジェクト
初期化時に 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.