VTK  9.0.2
vtkOpenGLFramebufferObject.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkOpenGLFramebufferObject.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
129 #ifndef vtkOpenGLFramebufferObject_h
130 #define vtkOpenGLFramebufferObject_h
131 
132 /* Dec 2018 this class has been cleaned up such that
133  * AddColorAttachment and AddDepthAttachment no longer
134  * take a mode argument. The mode is determined by how
135  * the framebuffer is bound. If you are using these methods
136  * and need to support both the old and new signatures you
137  * can check for the following define in your code.
138  */
139 #define VTK_UPDATED_FRAMEBUFFER
140 
147 #ifdef NDEBUG
148 #define vtkCheckFrameBufferStatusMacro(mode)
149 #define vtkStaticCheckFrameBufferStatusMacro(mode)
150 #else
151 #define vtkCheckFrameBufferStatusMacroImpl(macro, mode) \
152  { \
153  const char* eStr; \
154  bool ok = vtkOpenGLFramebufferObject::GetFrameBufferStatus(mode, eStr); \
155  if (!ok) \
156  { \
157  macro(<< "OpenGL ERROR. The FBO is incomplete : " << eStr); \
158  } \
159  }
160 #define vtkCheckFrameBufferStatusMacro(mode) vtkCheckFrameBufferStatusMacroImpl(vtkErrorMacro, mode)
161 #define vtkStaticCheckFrameBufferStatusMacro(mode) \
162  vtkCheckFrameBufferStatusMacroImpl(vtkGenericWarningMacro, mode)
163 #endif
164 
166 #include "vtkRenderingOpenGL2Module.h" // For export macro
167 #include <map> // for the maps
168 #include <vector> // for the lists of logical buffers.
169 
170 class vtkFOInfo;
175 class vtkRenderWindow;
176 class vtkRenderbuffer;
177 class vtkShaderProgram;
178 class vtkTextureObject;
179 class vtkWindow;
180 
181 class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLFramebufferObject : public vtkFrameBufferObjectBase
182 {
183 public:
186  void PrintSelf(ostream& os, vtkIndent indent) override;
187 
189 
196  void SetContext(vtkRenderWindow* context);
199 
203  void Bind();
204  void Bind(unsigned int mode);
205 
209  void UnBind();
210  void UnBind(unsigned int mode);
211 
213 
221 
223 
232  bool Start(int width, int height);
233  bool StartNonOrtho(int width, int height);
235 
240  void InitializeViewport(int width, int height);
241 
243  // activate deactivate draw/read buffers (color buffers)
244  void ActivateDrawBuffers(unsigned int n);
245  void ActivateDrawBuffers(unsigned int* ids, int n);
246  void ActivateDrawBuffer(unsigned int id);
247  void ActivateReadBuffer(unsigned int id);
248  void ActivateBuffer(unsigned int id)
249  {
250  this->ActivateDrawBuffer(id);
251  this->ActivateReadBuffer(id);
252  }
256 
257  vtkGetMacro(ActiveReadBuffer, unsigned int);
258  unsigned int GetActiveDrawBuffer(unsigned int id);
259 
270  void RenderQuad(int minX, int maxX, int minY, int maxY, vtkShaderProgram* program,
272 
274 
277  void AddColorAttachment(unsigned int attId, vtkTextureObject* tex, unsigned int zslice = 0,
278  unsigned int format = 0, unsigned int mipmapLevel = 0);
279  void AddColorAttachment(unsigned int attId, vtkRenderbuffer* tex);
280  void RemoveColorAttachment(unsigned int index);
281  void RemoveColorAttachments(unsigned int num);
283 
288 
290 
298 
300 
305  bool PopulateFramebuffer(int width, int height);
306  bool PopulateFramebuffer(int width, int height, bool useTextures, int numberOfColorAttachments,
307  int colorDataType, bool wantDepthAttachment, int depthBitplanes, int multisamples,
308  bool wantStencilAttachment = false);
310 
317 
324 
326 
329  int* GetLastSize() override
330  {
331  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): returning LastSize pointer "
332  << this->LastSize);
333  return this->LastSize;
334  }
335  void GetLastSize(int& _arg1, int& _arg2) override
336  {
337  _arg1 = this->LastSize[0];
338  _arg2 = this->LastSize[1];
339  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): returning LastSize (" << _arg1
340  << "," << _arg2 << ")");
341  }
342  void GetLastSize(int _arg[2]) override { this->GetLastSize(_arg[0], _arg[1]); }
344 
349  static bool IsSupported(vtkOpenGLRenderWindow*) { return true; }
350 
355  int CheckFrameBufferStatus(unsigned int mode);
356 
361 
368  static bool GetFrameBufferStatus(unsigned int mode, const char*& desc);
369 
370  vtkGetMacro(FBOIndex, unsigned int);
371 
378  static int Blit(
379  const int srcExt[4], const int destExt[4], unsigned int bits, unsigned int mapping);
380 
389  vtkPixelBufferObject* DownloadColor1(int extent[4], int vtkType, int channel);
390 
392 
394 
401 
410  int extent[4], int vtkType, int nComps, int oglType, int oglFormat);
411 
412  static void Download(
413  int extent[4], int vtkType, int nComps, int oglType, int oglFormat, vtkPixelBufferObject* pbo);
414 
415  // returns the mode values for draw/read/both
416  // Can be used in cases where you do not
417  // want to have OpenGL code mixed in.
418  static unsigned int GetDrawMode();
419  static unsigned int GetReadMode();
420  static unsigned int GetBothMode();
421 
425  void Resize(int width, int height);
426 
428 
429 protected:
433  void AttachColorBuffer(unsigned int index);
435 
439  static bool LoadRequiredExtensions(vtkOpenGLRenderWindow*) { return true; }
440 
442 
443  // gen buffer (occurs when context is set)
444  void CreateFBO();
445 
446  // delete buffer (occurs during destruction or context switch)
447  void DestroyFBO();
448 
449  // detach and delete our reference(s)
452 
453  // glDrawBuffers
455 
456  // examine attachments to see if they have the same size
457  void UpdateSize();
458 
463 
467  void DisplayFrameBufferAttachment(unsigned int uattachment);
468 
473 
478 
482  void DisplayBuffer(int value);
483 
487  int GetOpenGLType(int vtkType);
488 
491 
493 
494  unsigned int FBOIndex;
495 
500 
501  int LastSize[2];
502  std::vector<unsigned int> ActiveBuffers;
503  unsigned int ActiveReadBuffer;
504 
505  vtkFOInfo* DepthBuffer;
506  std::map<unsigned int, vtkFOInfo*> ColorBuffers;
507 
508 private:
510  void operator=(const vtkOpenGLFramebufferObject&) = delete;
511 };
512 
513 #endif
abstract interface to OpenGL FBOs
a simple class to control print indentation
Definition: vtkIndent.h:34
const char * GetClassName() const
Return the class name as a string.
Internal class which encapsulates OpenGL FramebufferObject.
void Bind()
Make the draw frame buffer active.
void ActivateDrawBuffer(unsigned int id)
~vtkOpenGLFramebufferObject() override
std::vector< unsigned int > ActiveBuffers
void SaveCurrentBindingsAndBuffers(unsigned int mode)
void AttachColorBuffer(unsigned int index)
Attach a specific buffer.
static bool IsSupported(vtkOpenGLRenderWindow *)
Returns if the context supports the required extensions.
void ActivateDrawBuffers(unsigned int *ids, int n)
void UnBind()
Unbind this buffer.
void InitializeViewport(int width, int height)
Set up ortho viewport with scissor, lighting, blend, and depth disabled.
void RestorePreviousBindingsAndBuffers(unsigned int mode)
void UnBind(unsigned int mode)
vtkPixelBufferObject * Download(int extent[4], int vtkType, int nComps, int oglType, int oglFormat)
Download data from the read buffer of the current FBO.
void GetLastSize(int &_arg1, int &_arg2) override
static void Download(int extent[4], int vtkType, int nComps, int oglType, int oglFormat, vtkPixelBufferObject *pbo)
void RemoveColorAttachment(unsigned int index)
void Bind(unsigned int mode)
void DisplayFrameBufferAttachment(unsigned int uattachment)
Display a given attachment for the current framebuffer object.
void AddDepthAttachment(vtkTextureObject *tex)
void RemoveColorAttachments(unsigned int num)
bool StartNonOrtho(int width, int height)
void DisplayDrawBuffers()
Display the draw buffers.
void RenderQuad(int minX, int maxX, int minY, int maxY, vtkShaderProgram *program, vtkOpenGLVertexArrayObject *vao)
Renders a quad at the given location with pixel coordinates.
void DestroyDepthBuffer(vtkWindow *win)
bool PopulateFramebuffer(int width, int height)
Convenience method to populate a framebuffer with attachments created as well.
void GetLastSize(int _arg[2]) override
static unsigned int GetBothMode()
int CheckFrameBufferStatus(unsigned int mode)
Validate the current FBO configuration (attachments, formats, etc) prints detected errors to vtkError...
void DisplayFrameBufferAttachments()
Display all the attachments of the current framebuffer object.
void DisplayReadBuffer()
Display the read buffer.
vtkGenericOpenGLResourceFreeCallback * ResourceCallback
bool PopulateFramebuffer(int width, int height, bool useTextures, int numberOfColorAttachments, int colorDataType, bool wantDepthAttachment, int depthBitplanes, int multisamples, bool wantStencilAttachment=false)
static int Blit(const int srcExt[4], const int destExt[4], unsigned int bits, unsigned int mapping)
Copy from the currently bound READ FBO to the currently bound DRAW FBO.
static bool LoadRequiredExtensions(vtkOpenGLRenderWindow *)
Load all necessary extensions.
int GetOpenGLType(int vtkType)
Given a vtk type get a compatible open gl type.
void Resize(int width, int height)
Resize all FO attachments.
bool Start(int width, int height)
User must take care that width/height match the dimensions of the user defined texture attachments.
void ActivateDrawBuffers(unsigned int n)
static unsigned int GetDrawMode()
unsigned int GetActiveDrawBuffer(unsigned int id)
int * GetLastSize() override
Dimensions in pixels of the framebuffer.
static bool GetFrameBufferStatus(unsigned int mode, const char *&desc)
Validate the current FBO configuration (attachments, formats, etc) return false if the FBO is incompl...
vtkPixelBufferObject * DownloadDepth(int extent[4], int vtkType)
Download data from the depth attachment of the currently bound FBO.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void AddDepthAttachment()
Directly assign/remove a texture/renderbuffer to depth attachments.
static vtkOpenGLFramebufferObject * New()
virtual void ReleaseGraphicsResources(vtkWindow *win)
Deactivate and UnBind.
std::map< unsigned int, vtkFOInfo * > ColorBuffers
void DestroyColorBuffers(vtkWindow *win)
vtkPixelBufferObject * DownloadColor4(int extent[4], int vtkType)
int GetNumberOfColorAttachments()
Return the number of color attachments for the given mode.
void DisplayBuffer(int value)
Display any buffer (convert value into string).
unsigned int GetMaximumNumberOfRenderTargets()
Returns the maximum number of render targets available.
void SaveCurrentBindingsAndBuffers()
Store/Restore the current framebuffer bindings and buffers.
void AddColorAttachment(unsigned int attId, vtkRenderbuffer *tex)
vtkPixelBufferObject * DownloadColor1(int extent[4], int vtkType, int channel)
Download data from the read color attachment of the currently bound FBO into the returned PBO.
void AddDepthAttachment(vtkRenderbuffer *tex)
vtkOpenGLRenderWindow * GetContext()
vtkPixelBufferObject * DownloadColor3(int extent[4], int vtkType)
void AddColorAttachment(unsigned int attId, vtkTextureObject *tex, unsigned int zslice=0, unsigned int format=0, unsigned int mipmapLevel=0)
Directly assign/remove a texture to color attachments.
unsigned int GetMaximumNumberOfActiveTargets()
Returns the maximum number of targets that can be rendered to at one time.
void SetContext(vtkRenderWindow *context)
Get/Set the context.
void ActivateReadBuffer(unsigned int id)
static unsigned int GetReadMode()
OpenGL rendering window.
The VertexArrayObject class uses, or emulates, vertex array objects.
abstracts an OpenGL pixel buffer object.
create a window for renderers to draw into
Storage for FBO's.
The ShaderProgram uses one or more Shader objects.
abstracts an OpenGL texture object.
window superclass for vtkRenderWindow
Definition: vtkWindow.h:38
@ mode
Definition: vtkX3D.h:253
@ value
Definition: vtkX3D.h:226
@ extent
Definition: vtkX3D.h:351
@ height
Definition: vtkX3D.h:260
@ index
Definition: vtkX3D.h:252