*第14回目 OpenGLでframebufferobjects [#la97abed]
 framebufferobjectsを使ってテクスチャに描画する。
 OpenGLの拡張機能として定義されているためOpenGLのバージョンが低いと使えない。
 サンプルプログラムは1キーを押すとframebufferobjectsをテクスチャとして使用。
 2キーを押すとテクスチャの張ってない立方体の描画。ESCキーで終了。
 数字キーはフルキー側です。テンキーでは操作できないかもしれない。
 テクスチャサイズが640x480で2のべき乗になっていないので機種によってはダメかも。
 その場合は512x512などにしたら良いと思う。
**WindowsでOpenGL拡張機能の準備 [#k9b68e75]
 VisualStudioでは標準でOpenGLの拡張機能に対応していないため
 http://www.opengl.org/registry/
 からglext.hをダウンロードする必要がある。
 また、使用する関数のポインタを取得する必要がある。
(例)glGenFramebuffersEXT関数のポインタを取得する方法。
 #include "glext.h"
 PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT;
 glGenFramebuffersEXT = reinterpret_cast<PFNGLGENFRAMEBUFFERSEXTPROC>(wglGetProcAddress("glGenFramebuffersEXT"));
 if(!glGenFramebuffersEXT)
 {
 	// error
 }
#author("2018-06-18T16:07:20+09:00","default:kuran","kuran")

 このようにして使用する全ての関数のポインタを取得する必要がある。
 サンプルプログラムでは以下の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拡張機能の準備 [#l7570796]
 Xcodeは始めからOpenGLの拡張機能に対応しているため設定が簡単。
 OpenGL.frameworkを追加するだけでOpenGLの拡張機能の命令が使用できる。
**framebufferobjectsの使い方 [#h4e6d17f]
***初期化 [#hfe1f974]
 #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
 }
***描画 [#iec8a26d]
 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);
***テクスチャとして使用 [#d0818e1f]
 glBindTexture(GL_TEXTURE_2D, texture_id);
 を実行するとそのままテクスチャに使用できる。
***終了 [#b63594a1]
 glDeleteTextures(1, &texture_id);
 glDeleteRenderbuffersEXT(1, &rbo_id);
 glDeleteFramebuffersEXT(1, &fbo_id);
**画面 [#gd33c571]
***Windows [#o054b791]
#ref(framebufferobjects_windows1.png,,,100%)~
#ref(framebufferobjects_windows2.png,,,100%)~
***MacOSX [#f4f81416]
#ref(framebufferobjects_macosx1.png,,,100%)~
#ref(framebufferobjects_macosx2.png,,,100%)~
**ダウンロード [#f14bab2e]
***実行ファイル [#d53b648f]
(Windows版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/framebufferobjects_sample_20090629_windows.zip)~
(MacOSX版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/framebufferobjects_sample_20090629_macosx.zip)~
***ソースファイル [#ya31b60e]
(Windows版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/framebufferobjects_sample_source_20090629_windows.zip)~
(MacOSX10版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/framebufferobjects_sample_source_20090629_macosx.zip)~

[[前に戻る>プログラミング]]


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS