framebufferobjectsを使ってテクスチャに描画する。 OpenGLの拡張機能として定義されているためOpenGLのバージョンが低いと使えない。 サンプルプログラムは1キーを押すとframebufferobjectsをテクスチャとして使用。 2キーを押すとテクスチャの張ってない立方体の描画。ESCキーで終了。 数字キーはフルキー側です。テンキーでは操作できないかもしれない。 テクスチャサイズが640x480で2のべき乗になっていないので機種によってはダメかも。 その場合は512x512などにしたら良いと思う。
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;
Xcodeは始めからOpenGLの拡張機能に対応しているため設定が簡単。 OpenGL.frameworkを追加するだけでOpenGLの拡張機能の命令が使用できる。
#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);
#ref(): File not found: "framebufferobjects_windows1.png" at page "OpenGLでframebufferobjects"
#ref(): File not found: "framebufferobjects_windows2.png" at page "OpenGLでframebufferobjects"
#ref(): File not found: "framebufferobjects_macosx1.png" at page "OpenGLでframebufferobjects"
#ref(): File not found: "framebufferobjects_macosx2.png" at page "OpenGLでframebufferobjects"
(Windows版)
(MacOSX版)
(Windows版)
(MacOSX10版)
前に戻る?