|
From: Tapio V. <aa...@us...> - 2010-11-06 13:24:26
|
Module: performous
Branch: opengl2
Commit: 5c22b0385edcf3fe5d98a13aed4da2dd3b31c932
Author: Tapio Vierros <tap...@gm...>
Date: Sat Nov 6 15:22:29 2010 +0200
Preliminary Frame Buffer Object class.
---
game/fbo.hh | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/game/fbo.hh b/game/fbo.hh
new file mode 100644
index 0000000..4199393
--- /dev/null
+++ b/game/fbo.hh
@@ -0,0 +1,46 @@
+#pragma once
+
+#include "video_driver.hh"
+
+/// Frame Buffer Object class
+class FBO {
+ public:
+ /// Generate the FBO and attach a fresh texture to it
+ FBO(): m_texture() {
+ glGenFramebuffersEXT(1, &m_fbo);
+ bind();
+ {
+ UseTexture tex(m_texture);
+ glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, screenW(), screenH(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ // Bind texture as COLOR_ATTACHMENT0
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, m_texture.id(), 0);
+ }
+ unbind();
+ }
+ /// Handle clean-up
+ ~FBO() {
+ if (m_fbo) glDeleteFramebuffersEXT(1, &m_fbo);
+ }
+ /// Returns a reference to the attached texture
+ OpenGLTexture<GL_TEXTURE_RECTANGLE_ARB>& getTexture() {
+ return m_texture;
+ }
+ /// Bind the FBO into use
+ void bind() {
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
+ }
+ /// Unbind any FBO
+ static void unbind() {
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ }
+
+ private:
+ GLuint m_fbo;
+ OpenGLTexture<GL_TEXTURE_RECTANGLE_ARB> m_texture;
+};
+
+/// RAII FBO binder
+struct UseFBO {
+ UseFBO(FBO& fbo) { fbo.bind(); }
+ ~UseFBO() { FBO::unbind(); }
+};
|