diff options
Diffstat (limited to 'KaplaDemo/samples/sampleViewer3/Render/FrameBufferObjectMRT.h')
| -rw-r--r-- | KaplaDemo/samples/sampleViewer3/Render/FrameBufferObjectMRT.h | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/KaplaDemo/samples/sampleViewer3/Render/FrameBufferObjectMRT.h b/KaplaDemo/samples/sampleViewer3/Render/FrameBufferObjectMRT.h new file mode 100644 index 00000000..d899cda0 --- /dev/null +++ b/KaplaDemo/samples/sampleViewer3/Render/FrameBufferObjectMRT.h @@ -0,0 +1,220 @@ + +/**********************************************************************\ +* AUTHOR : HILLAIRE S�bastien +* +* MAIL : [email protected] +* SITE : sebastien.hillaire.free.fr +* +* You are free to totally or partially use this file/code. +* If you do, please credit me in your software or demo and leave this +* note. +* Share your work and your ideas as much as possible! +\*********************************************************************/ + + +#ifndef _FRAME_BUFFER_OBJECT_OPENGL_ +#define _FRAME_BUFFER_OBJECT_OPENGL_ + +#ifdef WIN32 +#include <windows.h> +#endif + +#include "stdlib.h" +#include "assert.h" +#include "stdio.h" +#include "GL/glew.h" + +typedef enum{ + FBO_DepthBufferType_NONE=0, + FBO_DepthBufferType_TEXTURE=1, + FBO_DepthBufferType_RENDERTARGET=2 +} FBO_DepthBufferType; + +/** + * The FrameBufferObject class allowing to use render to texture + */ +class FrameBufferObjectMRT +{ +private: + /** + * The OpenGL FBO ID + */ + GLuint fbo; + + /** + * the table containing all texture id of each render target + */ + GLuint* colorTextures; + /** + * the number of color attachement + */ + GLint nbColorAttachement; + /** + * The minification filtering for the color buffer textures + */ + GLuint *colorMinificationFiltering; + + /** + * the depth texture/buffer id + */ + GLuint depthID; + /** + * the depth type + */ + FBO_DepthBufferType depthType; + /** + * The minification filtering for the depth buffer texture + */ + GLuint depthMinificationFiltering; + + /** + * the width in pixel + */ + unsigned int width; + /** + * the height in pixel + */ + unsigned int height; + + /** + * default constructeur not allowed + */ + FrameBufferObjectMRT(); + /** + * copy constructeur not allowed + */ + FrameBufferObjectMRT(FrameBufferObjectMRT&); + /** + * copy assignement operator not allowed + */ + FrameBufferObjectMRT& operator=(const FrameBufferObjectMRT&); + +public: + + /** + * The only available constructor + */ + FrameBufferObjectMRT(unsigned int width, unsigned int height, + unsigned int nbColorBuffer, + const unsigned int* colorBufferInternalFormat, + const unsigned int* colorBufferSWRAP, + const unsigned int* colorBufferTWRAP, + const unsigned int* colorBufferMinFiltering, + const unsigned int* colorBufferMagFiltering, + FBO_DepthBufferType depthBufferType=FBO_DepthBufferType_NONE, + const unsigned int depthBufferMinFiltering=GL_LINEAR, + const unsigned int depthBufferMagFiltering=GL_LINEAR, + const unsigned int depthBufferSWRAP=GL_CLAMP, + const unsigned int depthBufferTWRAP=GL_CLAMP); + + /** + * The destructor + */ + ~FrameBufferObjectMRT(); + + /** + * @return the number of color attachment of this FBO + */ + unsigned int getNumberOfColorAttachement() const; + /** + * @return the type of depth buffer of this FBO + */ + FBO_DepthBufferType getDepthBufferType() const; + + /** + * @return the width in pixel of this FBO + */ + unsigned int getWidth() const; + /** + * @return the height in pixel of this FBO + */ + unsigned int getHeight() const; + + /** + * @return the maximum number of color texture attachement + */ + static const GLint getMaxColorAttachments(); + /** + * @return the maximum width and height allowed + */ + static const GLint getMaxBufferSize(); + + /** + * Enable this FBO to render in ONE texture using the depth buffer if it exist. + * To disable rendering in the depth buffer and/or depth testing, use glDepthMask and glDisable(GL_DEPTH_TEST). + * + * @param colorBufferNum : the number of the render texture (0 for GL_COLOR_ATTACHMENT0_EXT, etc) + */ + void enableRenderToColorAndDepth(const unsigned int colorBufferNum) const; + /** + * Enable this FBO to render in MULTIPLE texture using the depth buffer if it exist. + * To disable rendering in the depth buffer and/or depth testing, use glDepthMask and glDisable(GL_DEPTH_TEST). + * Using this method, you must not use gl_fragColor in the fragment program but gl_fragData[i]. + * + * @param numBuffers : the number of renger target we want + * @param drawbuffers : an array containing the color texture ID binded to the fragment program output gl_fragData[i] + */ + void enableRenderToColorAndDepth_MRT(const GLuint numBuffers, const GLenum* drawbuffers) const; + /** + * Disable render to texture. This method os static because it works the same way for all fbo instance. + * Thus, if you want to render to two render texture sequentially, you don't need to disable fbo rendering + * and it will improves performances. + */ + static void disableRenderToColorDepth(); + + /** + * Save the current viewport and set up the viewport for this fbo. If the FBO is has same resolution as the current + * viewport, you don't need to call this method. + */ + void saveAndSetViewPort() const; + /** + * Restore previous viewport. + * @see saveAndSetViewPort + */ + void restoreViewPort() const; + + + GLuint getColorBuffer(int colorBufferNum) { + if(this->nbColorAttachement>0 && (int)colorBufferNum<this->nbColorAttachement) + { + return this->colorTextures[colorBufferNum]; + } + return NULL; + } + /** + * Bind a color buffer in the current texture unit as a GL_TEXTURE_2D. + * + * @param colorBufferNum : the number of the color buffer texture to bind. If the number is invalid, texture 0 is binded + */ + void bindColorTexture(const unsigned int colorBufferNum) const; + /** + * Bind the depth buffer in the current texture unit as a GL_TEXTURE_2D. + */ + void bindDepthTexture() const; + + /** + * Generate the mipmap chain for a given color buffer. + * The mipmap generation will not work for texture-buffer you have specified with GL_NEAREST or GL_LINEAR at the creation. + * + * @param colorBufferNum : the number of the color buffer texture to bind. If the number is invalid, we return. + */ + void generateColorBufferMipMap(const unsigned int colorBufferNum) const; + /** + * Generate the mipmap chain for the depth buffer. Some driver don't support it. + */ + void generateDepthBufferMipMap() const; + + /** + * Save a given color bufferin a bitmap file. + * + * @param colorBufferNum : the number of the color buffer texture to bind. If the number is invalid, we return. + * @param filepath : the path of the bitmap file. + */ + //void saveToDisk(const unsigned int colorBufferNum, const char* filepath) const; + +}; + + + +#endif + |