1 #ifndef OPENGL_FRAME_BUFFER_H
2 #define OPENGL_FRAME_BUFFER_H
4 #include <OpenGl_Extension.hxx>
6 #include <Standard_Boolean.hxx>
7 #include <InterfaceGraphic.hxx>
9 #ifndef GL_FRAMEBUFFER_EXT
10 #define GL_FRAMEBUFFER_EXT 0x8D40
13 #ifndef GL_COLOR_ATTACHMENT0_EXT
14 #define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
17 #ifndef GL_FRAMEBUFFER_COMPLETE_EXT
18 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5
21 #ifndef GL_RENDERBUFFER_EXT
22 #define GL_RENDERBUFFER_EXT 0x8D41
25 #ifndef GL_DEPTH_ATTACHMENT_EXT
26 #define GL_DEPTH_ATTACHMENT_EXT 0x8D00
30 #define GL_API_ENTRY APIENTRY
35 class OpenGl_FrameBuffer
41 static const GLuint NO_TEXTURE = 0;
42 static const GLuint NO_FRAMEBUFFER = 0;
43 static const GLuint NO_RENDERBUFFER = 0;
47 typedef void (GL_API_ENTRY *glGenFramebuffersEXT_t) (GLsizei n, GLuint* ids);
48 typedef void (GL_API_ENTRY *glDeleteFramebuffersEXT_t) (GLsizei n, GLuint* ids);
49 typedef void (GL_API_ENTRY *glBindFramebufferEXT_t) (GLenum target, GLuint id);
50 typedef void (GL_API_ENTRY *glFramebufferTexture2DEXT_t) (GLenum target, GLenum attachmentPoint,
51 GLenum textureTarget, GLuint textureId,
53 typedef GLenum (GL_API_ENTRY *glCheckFramebufferStatusEXT_t) (GLenum target);
54 typedef void (GL_API_ENTRY *glGenRenderbuffersEXT_t) (GLsizei n, GLuint* ids);
55 typedef void (GL_API_ENTRY *glDeleteRenderbuffersEXT_t) (GLsizei n, GLuint* ids);
56 typedef void (GL_API_ENTRY *glBindRenderbufferEXT_t) (GLenum target, GLuint id);
57 typedef void (GL_API_ENTRY *glRenderbufferStorageEXT_t) (GLenum target, GLenum internalFormat,
58 GLsizei width, GLsizei height);
60 typedef void (GL_API_ENTRY *glFramebufferRenderbufferEXT_t) (GLenum target,
61 GLenum attachmentPoint,
62 GLenum renderbufferTarget,
63 GLuint renderbufferId);
67 OpenGl_FrameBuffer (GLint theTextureFormat = GL_RGBA8);
69 virtual ~OpenGl_FrameBuffer()
75 GLsizei GetSizeX() const
81 GLsizei GetSizeY() const
87 GLsizei GetVPSizeX() const
93 GLsizei GetVPSizeY() const
98 //! Returns true if current object was initialized
99 Standard_Boolean IsValid() const
101 return IsValidFrameBuffer() && IsValidTexture() && IsValidDepthBuffer();
104 //! Notice! Obsolete hardware (GeForce FX etc)
105 //! doesn't support rectangular textures!
106 //! There are 3 possible results if you are trying
107 //! to create non power-of-two FBO on these cards:
108 //! 1) FBO creation will fail,
109 //! current implementation will try to generate compatible FBO;
110 //! 2) FBO rendering will be done in software mode (ForceWare 'hack');
111 //! 3) FBO rendering will be incorrect (some obsolete Catalyst drivers).
112 Standard_Boolean Init (GLsizei theViewportSizeX,
113 GLsizei theViewportSizeY,
114 GLboolean toForcePowerOfTwo = GL_FALSE);
116 //! Release GL objects
119 //! Setup viewport to render into FBO
122 glViewport (0, 0, myVPSizeX, myVPSizeY);
125 //! Override viewport settings
126 void ChangeViewport (const GLsizei theVPSizeX,
127 const GLsizei theVPSizeY)
129 myVPSizeX = theVPSizeX;
130 myVPSizeY = theVPSizeY;
133 //! Bind frame buffer (to render into the texture).
136 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, myGlFBufferId);
139 //! Unbind frame buffer.
142 glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, NO_FRAMEBUFFER);
145 //! Bind the texture.
148 glEnable (GL_TEXTURE_2D); // needed only for fixed pipeline rendering
149 glBindTexture (GL_TEXTURE_2D, myGlTextureId);
152 //! Unbind the texture.
155 glBindTexture (GL_TEXTURE_2D, NO_TEXTURE);
156 glDisable (GL_TEXTURE_2D); // needed only for fixed pipeline rendering
161 //! Check texture could be created
162 Standard_Boolean IsProxySuccess() const;
164 //! Generate texture with undefined data
165 Standard_Boolean InitTrashTexture();
167 Standard_Boolean IsValidTexture() const
169 return myGlTextureId != NO_TEXTURE;
172 Standard_Boolean IsValidFrameBuffer() const
174 return myGlFBufferId != NO_FRAMEBUFFER;
177 Standard_Boolean IsValidDepthBuffer() const
179 return myGlTextureId != NO_RENDERBUFFER;
182 Standard_Boolean AreFBOFunctionsValid();
183 Standard_Boolean InitFBOFunctions();
187 GLsizei mySizeX; // texture width
188 GLsizei mySizeY; // texture height
189 GLsizei myVPSizeX; // viewport width (should be <= texture width)
190 GLsizei myVPSizeY; // viewport height (should be <= texture height)
191 GLint myTextFormat; // GL_RGB, GL_RGBA,...
192 GLuint myGlTextureId; // GL texture ID
193 GLuint myGlFBufferId; // FBO object ID
194 GLuint myGlDepthRBId; // RenderBuffer object for depth ID
197 glGenFramebuffersEXT_t glGenFramebuffersEXT;
198 glDeleteFramebuffersEXT_t glDeleteFramebuffersEXT;
199 glBindFramebufferEXT_t glBindFramebufferEXT;
200 glFramebufferTexture2DEXT_t glFramebufferTexture2DEXT;
201 glCheckFramebufferStatusEXT_t glCheckFramebufferStatusEXT;
202 glGenRenderbuffersEXT_t glGenRenderbuffersEXT;
203 glDeleteRenderbuffersEXT_t glDeleteRenderbuffersEXT;
204 glBindRenderbufferEXT_t glBindRenderbufferEXT;
205 glRenderbufferStorageEXT_t glRenderbufferStorageEXT;
206 glFramebufferRenderbufferEXT_t glFramebufferRenderbufferEXT;
210 #endif //OPENGL_FRAME_BUFFER_H