第14回目 OpenGLでframebufferobjects

framebufferobjectsを使ってテクスチャに描画する。
OpenGLの拡張機能として定義されているためOpenGLのバージョンが低いと使えない。
サンプルプログラムは1キーを押すとframebufferobjectsをテクスチャとして使用。
2キーを押すとテクスチャの張ってない立方体の描画。ESCキーで終了。
数字キーはフルキー側です。テンキーでは操作できないかもしれない。
テクスチャサイズが640x480で2のべき乗になっていないので機種によってはダメかも。
その場合は512x512などにしたら良いと思う。

WindowsでOpenGL拡張機能の準備

VisualStudioでは標準でOpenGLの拡張機能に対応していないため
http://www.opengl.org/registry/
からglext.hをダウンロードする必要がある。
また、使用する関数のポインタを取得する必要がある。

(例)glGenFramebuffersEXT関数のポインタを取得する方法。

#include "glext.h"
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
glGenFramebuffersEXT = reinterpret_cast<PFNGLGENFRAMEBUFFERSEXTPROC>(wglGetProcAddress("glGenFramebuffersEXT"));
if(!glGenFramebuffersEXT)
{
	// error
}
このようにして使用する全ての関数のポインタを取得する必要がある。
サンプルプログラムでは以下の11のポインタを取得している。
PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT;
PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT;
PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT;
PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT;
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT;

MacOSXでOpenGL拡張機能の準備

Xcodeは始めからOpenGLの拡張機能に対応しているため設定が簡単。
OpenGL.frameworkを追加するだけでOpenGLの拡張機能の命令が使用できる。

framebufferobjectsの使い方

初期化

#define WIDTH 640
#define HEIGHT 480
GLuint fbo_id;
GLuint rbo_id;
GLuint texture_id;
// フレームバッファオブジェクト作成
glGenFramebuffersEXT(1, &fbo_id);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id);
// レンダリング用バッファオブジェクト作成
glGenRenderbuffersEXT(1, &rbo_id);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rbo_id);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, WIDTH, HEIGHT);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
// FBOとの対応付け
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture_id, 0);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rbo_id);
// エラーチェック
status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if(status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
	// error
}

描画

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_id);
:
// ここでframebufferobjectに描画する
:
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glGenerateMipmapEXT(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);

テクスチャとして使用

glBindTexture(GL_TEXTURE_2D, texture_id);
を実行するとそのままテクスチャに使用できる。

終了

glDeleteTextures(1, &texture_id);
glDeleteRenderbuffersEXT(1, &rbo_id);
glDeleteFramebuffersEXT(1, &fbo_id);

画面

Windows

framebufferobjects_windows1.png
framebufferobjects_windows2.png

MacOSX

framebufferobjects_macosx1.png
framebufferobjects_macosx2.png

ダウンロード

実行ファイル

(Windows版)

(MacOSX版)

ソースファイル

(Windows版)

(MacOSX10版)

前に戻る


添付ファイル: fileframebufferobjects_windows2.png 154件 [詳細] fileframebufferobjects_windows1.png 151件 [詳細] fileframebufferobjects_macosx2.png 154件 [詳細] fileframebufferobjects_macosx1.png 156件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-16 (日) 15:25:58 (2042d)