diff options
Diffstat (limited to 'tests/fboutils.cc')
-rw-r--r-- | tests/fboutils.cc | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tests/fboutils.cc b/tests/fboutils.cc new file mode 100644 index 0000000..d0430df --- /dev/null +++ b/tests/fboutils.cc @@ -0,0 +1,61 @@ +#include "fboutils.h" +#include <iostream> + +GLuint fbo_create(GLsizei width, GLsizei height) +{ + // Test if framebuffer objects are supported + // FIXME: Use GLEW + const GLubyte* strExt = glGetString(GL_EXTENSIONS); + GLboolean fboSupported = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt); + if (!fboSupported) { + std::cerr << "Your system does not support framebuffer extension - unable to render scene\n"; + return 0; + } + + // Create an FBO + GLuint fbo = 0; + GLuint renderBuffer = 0; + GLuint depthBuffer = 0; + // Depth buffer to use for depth testing - optional if you're not using depth testing + glGenRenderbuffersEXT(1, &depthBuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height); + REPORTGLERROR("creating depth render buffer"); + + // Render buffer to use for imaging + glGenRenderbuffersEXT(1, &renderBuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, width, height); + REPORTGLERROR("creating color render buffer"); + glGenFramebuffersEXT(1, &fbo); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); + REPORTGLERROR("binding framebuffer"); + + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + GL_RENDERBUFFER_EXT, renderBuffer); + REPORTGLERROR("specifying color render buffer"); + + if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { + std::cerr << "Problem with OpenGL framebuffer after specifying color render buffer.\n"; + return 0; + } + + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer); + REPORTGLERROR("specifying depth render buffer"); + + if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) { + std::cerr << "Problem with OpenGL framebuffer after specifying depth render buffer.\n"; + return 0; + } + return fbo; +} + +void fbo_bind(GLuint fbo) +{ + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); +} + +void fbo_unbind() +{ + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +} |