diff options
author | Marius Kintel <marius@kintel.net> | 2011-09-29 02:05:47 (GMT) |
---|---|---|
committer | Marius Kintel <marius@kintel.net> | 2011-09-29 02:05:47 (GMT) |
commit | 846970462afbe91e3c06f57c45e095a625aec0d3 (patch) | |
tree | bcd49faa6ced22e7046bf79c6024f26bb0d4b7e5 /tests/fboutils.cc | |
parent | c6e5e84eec401096451f14e9e853e33c3aa88853 (diff) |
More refactoring of offscreen rendering
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); +} |