#include <OpenGl_Context.hxx>
#include <OpenGl_Resource.hxx>
+#include <OpenGl_Texture.hxx>
-#include <Standard_Boolean.hxx>
-#include <InterfaceGraphic.hxx>
+class OpenGl_FrameBuffer;
+DEFINE_STANDARD_HANDLE(OpenGl_FrameBuffer, OpenGl_Resource)
//! Class implements FrameBuffer Object (FBO) resource
//! intended for off-screen rendering.
public:
//! Helpful constants
- static const GLuint NO_TEXTURE = 0;
- static const GLuint NO_FRAMEBUFFER = 0;
+ static const GLuint NO_FRAMEBUFFER = 0;
static const GLuint NO_RENDERBUFFER = 0;
public:
//! Empty constructor
- Standard_EXPORT OpenGl_FrameBuffer (GLint theTextureFormat = GL_RGBA8);
+ Standard_EXPORT OpenGl_FrameBuffer();
//! Destructor
Standard_EXPORT virtual ~OpenGl_FrameBuffer();
//! Destroy object - will release GPU memory if any.
- Standard_EXPORT virtual void Release (const OpenGl_Context* theGlCtx);
+ Standard_EXPORT virtual void Release (OpenGl_Context* theGlCtx) Standard_OVERRIDE;
+
+ //! Number of multisampling samples.
+ GLsizei NbSamples() const
+ {
+ return myNbSamples;
+ }
+
+ //! Return true if FBO has been created with color attachment.
+ bool HasColor() const
+ {
+ return myColorFormat != 0;
+ }
- //! Texture width.
+ //! Return true if FBO has been created with depth attachment.
+ bool HasDepth() const
+ {
+ return myDepthFormat != 0;
+ }
+
+ //! Textures width.
GLsizei GetSizeX() const
{
- return mySizeX;
+ return myColorTexture->SizeX();
}
- //! Texture height.
+ //! Textures height.
GLsizei GetSizeY() const
{
- return mySizeY;
+ return myColorTexture->SizeY();
}
//! Viewport width.
//! Returns true if current object was initialized
Standard_Boolean IsValid() const
{
- return isValidFrameBuffer() && isValidTexture() && isValidDepthBuffer() && isValidStencilBuffer();
+ return isValidFrameBuffer();
}
- //! Notice! Obsolete hardware (GeForce FX etc)
- //! doesn't support rectangular textures!
- //! There are 3 possible results if you are trying
- //! to create non power-of-two FBO on these cards:
- //! 1) FBO creation will fail,
- //! current implementation will try to generate compatible FBO;
- //! 2) FBO rendering will be done in software mode (ForceWare 'hack');
- //! 3) FBO rendering will be incorrect (some obsolete Catalyst drivers).
+ //! Initialize FBO for rendering into textures.
+ //! @param theGlCtx currently bound OpenGL context
+ //! @param theSizeX texture width
+ //! @param theSizeY texture height
+ //! @param theColorFormat color texture sized format (0 means no color attachment), e.g. GL_RGBA8
+ //! @param theDepthFormat depth-stencil texture sized format (0 means no depth attachment), e.g. GL_DEPTH24_STENCIL8
+ //! @param theNbSamples MSAA number of samples (0 means normal texture)
+ //! @return true on success
Standard_EXPORT Standard_Boolean Init (const Handle(OpenGl_Context)& theGlCtx,
- const GLsizei theViewportSizeX,
- const GLsizei theViewportSizeY,
- const GLboolean toForcePowerOfTwo = GL_FALSE);
+ const GLsizei theSizeX,
+ const GLsizei theSizeY,
+ const GLint theColorFormat,
+ const GLint theDepthFormat,
+ const GLsizei theNbSamples = 0);
+
+ //! (Re-)initialize FBO with specified dimensions.
+ Standard_EXPORT Standard_Boolean InitLazy (const Handle(OpenGl_Context)& theGlCtx,
+ const GLsizei theViewportSizeX,
+ const GLsizei theViewportSizeY,
+ const GLint theColorFormat,
+ const GLint theDepthFormat,
+ const GLsizei theNbSamples = 0);
+
+ //! (Re-)initialize FBO with properties taken from another FBO.
+ Standard_Boolean InitLazy (const Handle(OpenGl_Context)& theGlCtx,
+ const OpenGl_FrameBuffer& theFbo)
+ {
+ return InitLazy (theGlCtx, theFbo.myVPSizeX, theFbo.myVPSizeY, theFbo.myColorFormat, theFbo.myDepthFormat, theFbo.myNbSamples);
+ }
+
+ //! (Re-)initialize FBO with specified dimensions.
+ //! The Render Buffer Objects will be used for Color, Depth and Stencil attachments (as opposite to textures).
+ //! @param theGlCtx currently bound OpenGL context
+ //! @param theSizeX render buffer width
+ //! @param theSizeY render buffer height
+ //! @param theColorFormat color render buffer sized format, e.g. GL_RGBA8
+ //! @param theDepthFormat depth-stencil render buffer sized format, e.g. GL_DEPTH24_STENCIL8
+ //! @param theColorRBufferFromWindow when specified - should be ID of already initialized RB object, which will be released within this class
+ Standard_EXPORT Standard_Boolean InitWithRB (const Handle(OpenGl_Context)& theGlCtx,
+ const GLsizei theSizeX,
+ const GLsizei theSizeY,
+ const GLint theColorFormat,
+ const GLint theDepthFormat,
+ const GLuint theColorRBufferFromWindow = 0);
+
+ //! Initialize class from currently bound FBO.
+ //! Retrieved OpenGL objects will not be destroyed on Release.
+ Standard_EXPORT Standard_Boolean InitWrapper (const Handle(OpenGl_Context)& theGlCtx);
//! Setup viewport to render into FBO
Standard_EXPORT void SetupViewport (const Handle(OpenGl_Context)& theGlCtx);
Standard_EXPORT void ChangeViewport (const GLsizei theVPSizeX,
const GLsizei theVPSizeY);
- //! Bind frame buffer (to render into the texture).
- Standard_EXPORT void BindBuffer (const Handle(OpenGl_Context)& theGlCtx);
+ //! Bind frame buffer for drawing and reading (to render into the texture).
+ Standard_EXPORT virtual void BindBuffer (const Handle(OpenGl_Context)& theGlCtx);
- //! Unbind frame buffer.
- Standard_EXPORT void UnbindBuffer (const Handle(OpenGl_Context)& theGlCtx);
-
- //! Bind the texture.
- Standard_EXPORT void BindTexture (const Handle(OpenGl_Context)& theGlCtx);
+ //! Bind frame buffer for drawing GL_DRAW_FRAMEBUFFER (to render into the texture).
+ Standard_EXPORT virtual void BindDrawBuffer (const Handle(OpenGl_Context)& theGlCtx);
- //! Unbind the texture.
- Standard_EXPORT void UnbindTexture (const Handle(OpenGl_Context)& theGlCtx);
+ //! Bind frame buffer for reading GL_READ_FRAMEBUFFER
+ Standard_EXPORT virtual void BindReadBuffer (const Handle(OpenGl_Context)& theGlCtx);
-private:
-
- //! Check texture could be created
- Standard_Boolean isProxySuccess() const;
+ //! Unbind frame buffer.
+ Standard_EXPORT virtual void UnbindBuffer (const Handle(OpenGl_Context)& theGlCtx);
- //! Generate texture with undefined data
- Standard_Boolean initTrashTexture (const Handle(OpenGl_Context)& theGlContext);
+ //! Returns the color texture.
+ inline const Handle(OpenGl_Texture)& ColorTexture() const
+ {
+ return myColorTexture;
+ }
- Standard_Boolean isValidTexture() const
+ //! Returns the depth-stencil texture.
+ inline const Handle(OpenGl_Texture)& DepthStencilTexture() const
{
- return myGlTextureId != NO_TEXTURE;
+ return myDepthStencilTexture;
}
- Standard_Boolean isValidFrameBuffer() const
+ //! Returns the color Render Buffer.
+ GLuint ColorRenderBuffer() const
{
- return myGlFBufferId != NO_FRAMEBUFFER;
+ return myGlColorRBufferId;
}
- Standard_Boolean isValidDepthBuffer() const
+ //! Returns the depth Render Buffer.
+ GLuint DepthStencilRenderBuffer() const
{
- return myGlDepthRBId != NO_RENDERBUFFER;
+ return myGlDepthRBufferId;
}
- Standard_Boolean isValidStencilBuffer() const
+protected:
+
+ Standard_Boolean isValidFrameBuffer() const
{
- return myGlStencilRBId != NO_RENDERBUFFER;
+ return myGlFBufferId != NO_FRAMEBUFFER;
}
-private:
+protected:
- GLsizei mySizeX; //!< texture width
- GLsizei mySizeY; //!< texture height
- GLsizei myVPSizeX; //!< viewport width (should be <= texture width)
- GLsizei myVPSizeY; //!< viewport height (should be <= texture height)
- GLint myTextFormat; //!< GL_RGB, GL_RGBA,...
- GLuint myGlTextureId; //!< GL texture ID
- GLuint myGlFBufferId; //!< FBO object ID
- GLuint myGlDepthRBId; //!< RenderBuffer object for depth ID
- GLuint myGlStencilRBId; //!< RenderBuffer object for stencil ID
+ GLsizei myVPSizeX; //!< viewport width (should be <= texture width)
+ GLsizei myVPSizeY; //!< viewport height (should be <= texture height)
+ GLsizei myNbSamples; //!< number of MSAA samples
+ GLint myColorFormat; //!< sized format for color texture, GL_RGBA8 by default
+ GLint myDepthFormat; //!< sized format for depth-stencil texture, GL_DEPTH24_STENCIL8 by default
+ GLuint myGlFBufferId; //!< FBO object ID
+ GLuint myGlColorRBufferId; //!< color Render Buffer object (alternative to myColorTexture)
+ GLuint myGlDepthRBufferId; //!< depth-stencil Render Buffer object (alternative to myDepthStencilTexture)
+ bool myIsOwnBuffer; //!< flag indicating that FBO should be deallocated by this class
+ Handle(OpenGl_Texture) myColorTexture; //!< color texture object
+ Handle(OpenGl_Texture) myDepthStencilTexture; //!< depth-stencil texture object
public:
- DEFINE_STANDARD_RTTI(OpenGl_FrameBuffer) // Type definition
+ DEFINE_STANDARD_RTTIEXT(OpenGl_FrameBuffer,OpenGl_Resource) // Type definition
};
-DEFINE_STANDARD_HANDLE(OpenGl_FrameBuffer, OpenGl_Resource)
-
#endif // OPENGL_FRAME_BUFFER_H