VTK  9.3.0
vtkOpenGLRenderWindow.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
25 #ifndef vtkOpenGLRenderWindow_h
26 #define vtkOpenGLRenderWindow_h
27 
28 #include "vtkRect.h" // for vtkRecti
29 #include "vtkRenderWindow.h"
30 #include "vtkRenderingOpenGL2Module.h" // For export macro
31 #include "vtkType.h" // for ivar
32 #include <map> // for ivar
33 #include <set> // for ivar
34 #include <string> // for ivar
35 
36 VTK_ABI_NAMESPACE_BEGIN
37 class vtkIdList;
40 class vtkOpenGLHardwareSupport;
45 class vtkShaderProgram;
46 class vtkTexture;
47 class vtkTextureObject;
50 class vtkOpenGLState;
51 
52 class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLRenderWindow : public vtkRenderWindow
53 {
54 public:
56  void PrintSelf(ostream& os, vtkIndent indent) override;
57 
61  void Start() override;
62 
67  void Frame() override;
68 
72  const char* GetRenderingBackend() override;
73 
75 
81 
83 
88  unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
90  int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
92  int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
94  int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
96 
98 
101  float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
103  int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
105  int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
106  int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
107  int right = 0) override;
108  void ReleaseRGBAPixelData(float* data) override;
109  unsigned char* GetRGBACharPixelData(
110  int x, int y, int x2, int y2, int front, int right = 0) override;
112  int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
113  int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
114  int blend = 0, int right = 0) override;
115  int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
116  int blend = 0, int right = 0) override;
118 
120 
123  float* GetZbufferData(int x1, int y1, int x2, int y2) override;
124  int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
125  int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
126  int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
127  int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
129 
134 
139 
144 
148  int GetDepthBufferSize() override;
149 
154 
159  int GetColorBufferSizes(int* rgba) override;
160 
166  int GetColorBufferInternalFormat(int attachmentPoint);
167 
171  virtual void OpenGLInit();
172 
173  // Initialize the state of OpenGL that VTK wants for this window
174  virtual void OpenGLInitState();
175 
176  // Initialize VTK for rendering in a new OpenGL context
177  virtual void OpenGLInitContext();
178 
184  void GetOpenGLVersion(int& major, int& minor);
185 
190 
195 
200 
202 
205  vtkGetObjectMacro(RenderFramebuffer, vtkOpenGLFramebufferObject);
207 
211  vtkGetObjectMacro(DisplayFramebuffer, vtkOpenGLFramebufferObject);
212 
218 
223  void WaitForCompletion() override;
224 
228  virtual void DrawPixels(
229  int x1, int y1, int x2, int y2, int numComponents, int dataType, void* data);
230 
235  virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin,
236  int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents,
237  int dataType, void* data);
238 
243  virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void* data);
244 
248  virtual float GetMaximumHardwareLineWidth() { return this->MaximumHardwareLineWidth; }
249 
256  virtual bool IsPointSpriteBugPresent() { return false; }
257 
264  int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB);
265 
271  std::string GetOpenGLSupportMessage() { return this->OpenGLSupportMessage; }
272 
276  int SupportsOpenGL() override;
277 
281  const char* ReportCapabilities() override;
282 
289  virtual void Initialize() {}
290 
291  std::set<vtkGenericOpenGLResourceFreeCallback*> Resources;
292 
294  {
295  std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
296  if (it == this->Resources.end())
297  {
298  this->Resources.insert(cb);
299  }
300  }
301 
303  {
304  std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
305  if (it != this->Resources.end())
306  {
307  this->Resources.erase(it);
308  }
309  }
310 
320  virtual void PushContext() { this->MakeCurrent(); }
321  virtual void PopContext() {}
322 
328 
338  virtual bool SetSwapControl(int) { return false; }
339 
340  // Get the state object used to keep track of
341  // OpenGL state
342  virtual vtkOpenGLState* GetState() { return this->State; }
343 
344  // Get a VBO that can be shared by many
345  // It consists of normalized display
346  // coordinates for a quad and tcoords
348 
349  // Activate and return thje texture unit for a generic 2d 64x64
350  // float greyscale noise texture ranging from 0 to 1. The texture is
351  // a hard-coded blue noise texture. This texture unit will automatically
352  // be deactivated at the end of the render process.
354 
358  void End() override;
359 
363  void Render() override;
364 
369  void StereoMidpoint() override;
370 
371  // does VTKs framebuffer require resolving for reading pixels
373 
379 
384 
388  void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX,
389  int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
390 
392 
396  void BlitToRenderFramebuffer(bool includeDepth);
397  void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX,
398  int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
400 
406  {
407  BlitToHardware, // hardware buffers
408  BlitToCurrent, // currently bound draw framebuffer
409  NoBlit // no blit, GUI or external code will handle the blit
410  };
411 
413 
436  vtkSetClampMacro(FrameBlitMode, FrameBlitModes, BlitToHardware, NoBlit);
437  vtkGetMacro(FrameBlitMode, FrameBlitModes);
438  void SetFrameBlitModeToBlitToHardware() { this->SetFrameBlitMode(BlitToHardware); }
439  void SetFrameBlitModeToBlitToCurrent() { this->SetFrameBlitMode(BlitToCurrent); }
440  void SetFrameBlitModeToNoBlit() { this->SetFrameBlitMode(NoBlit); }
442 
444 
447  vtkSetMacro(FramebufferFlipY, bool);
448  vtkGetMacro(FramebufferFlipY, bool);
449  vtkBooleanMacro(FramebufferFlipY, bool);
451 
453  // copy depth values from a source framebuffer to a destination framebuffer
454  // using texture maps to do the copy. The source framebufferobject must be texture
455  // backed. This method is designed to work around issues with trying to blit depth
456  // values between framebuffers that have different depth formats.
457 
458  // blit entire source texture to active viewport
460 
461  // blit specified source texels to active viewport
462  virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2);
463 
464  // blit specified source texels to specified viewport
465  virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2,
466  int destX, int destY, int destX2, int destY2);
468 
469 protected:
472 
473  // blits the display buffers to the appropriate hardware buffers
475 
476  // when frame is called, at the end blit to the hardware buffers
478 
479  // a FSQ we use to resolve MSAA that handles gamma
481 
482  // a FSQ we use to blit depth values
484 
485  // a FSQ we use to flip framebuffer texture
487 
488  // a FSQ we use to read depth component on platforms with OpenGL ES implementations
489  // because `glReadPixels` cannot be used to read GL_DEPTH_COMPONENT
491 
492  // flip quad helpers Y tcoord
494 
495  // resolve and flip renderframebuffer as needed
496  // when copying to displayframebuffer. Returns
497  // true if the color buffer was copied.
499 
500  // On GLES, the depth attachment buffer cannot be downloaded from
501  // the GPU with `glReadPixels`.
502  // This method reads the depth buffer bits.
503  // The depth attachment size can be 8,16,24 or 32. The values are split into 4 8-bit numbers.
504  // These are stored in the form of an RGBA color attachment in DepthFrameBuffer.
505  // `glReadPixels` can read that RGBA format and reconstruct full 8,16,24 or 32-bit integer
506  // followed by scaling down to 0-1.
507  bool ReadDepthComponent(int depthSize);
508 
509  // used in testing for opengl support
510  // in the SupportsOpenGL() method
514 
515  virtual int ReadPixels(
516  const vtkRecti& rect, int front, int glFormat, int glType, void* data, int right = 0);
517 
526  int CreateFramebuffers(int width, int height);
529 
530  // used when we need to resolve a multisampled
531  // framebuffer
533 
534  // used when we need to read depth component
535  // with OpenGL ES 3
537 
541  virtual void CreateAWindow() = 0;
542 
546  virtual void DestroyWindow() = 0;
547 
551  void SaveGLState();
552 
557 
558  std::map<std::string, int> GLStateIntegers;
559 
564 
566 
568 
569  bool Initialized; // ensure glewinit has been called
570  bool GlewInitValid; // Did glewInit initialize with a valid state?
571 
573 
575 
576  // used for fast quad rendering
578 
579  // noise texture
581 
583 
584  // keep track of in case we need to recreate the framebuffer
586 
587  int ScreenSize[2];
588 
589 private:
591  void operator=(const vtkOpenGLRenderWindow&) = delete;
592 
593  // Keeping `State` private so the only way to access it is through
594  // `this->GetState()`.
595  vtkOpenGLState* State;
596 };
597 
598 VTK_ABI_NAMESPACE_END
599 #endif
dynamic, self-adjusting array of float
Definition: vtkFloatArray.h:40
list of point or cell ids
Definition: vtkIdList.h:32
a simple class to control print indentation
Definition: vtkIndent.h:38
OpenGL buffer object.
Internal class which encapsulates OpenGL FramebufferObject.
Class to make rendering a full screen quad easier.
OpenGL rendering window.
void Start() override
Begin the rendering process.
void ReleaseGraphicsResources(vtkWindow *) override
Free up any graphics resources associated with this window a value of NULL means the context may alre...
int GetColorBufferInternalFormat(int attachmentPoint)
Get the internal format of current attached texture or render buffer.
int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin, int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents, int dataType, void *data)
Replacement for the old glDrawPixels function, but it allows for scaling the data and using only part...
vtkOpenGLFramebufferObject * DisplayFramebuffer
std::map< std::string, int > GLStateIntegers
std::string GetOpenGLSupportMessage()
Return a message profiding additional details about the results of calling SupportsOpenGL() This can ...
int GetRGBAPixelData(int x, int y, int x2, int y2, int front, vtkFloatArray *data, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
bool ReadDepthComponent(int depthSize)
vtkOpenGLBufferObject * GetTQuad2DVBO()
vtkOpenGLQuadHelper * DepthReadQuad
virtual void DrawPixels(int x1, int y1, int x2, int y2, int numComponents, int dataType, void *data)
Replacement for the old glDrawPixels function.
int SetRGBAPixelData(int x, int y, int x2, int y2, float *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
int GetTextureUnitForTexture(vtkTextureObject *)
Get the texture unit for a given texture object.
virtual void Initialize()
Initialize the rendering window.
void RegisterGraphicsResources(vtkGenericOpenGLResourceFreeCallback *cb)
virtual void DestroyWindow()=0
Destroy a not-off-screen window.
FrameBlitModes
Define how the resulting image should be blitted when at the end of the Frame() call if SwapBuffers i...
virtual void TextureDepthBlit(vtkTextureObject *source)
vtkTypeBool OwnContext
Flag telling if the context has been created here or was inherited.
int GetZbufferData(int x1, int y1, int x2, int y2, float *z) override
Set/Get the zbuffer data from an image.
virtual void TextureDepthBlit(vtkTextureObject *source, int srcX, int srcY, int srcX2, int srcY2, int destX, int destY, int destX2, int destY2)
void StereoMidpoint() override
Intermediate method performs operations required between the rendering of the left and right eye.
vtkTextureObject * NoiseTextureObject
vtkOpenGLFramebufferObject * ResolveFramebuffer
int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray *buffer) override
Set/Get the zbuffer data from an image.
unsigned char * GetRGBACharPixelData(int x, int y, int x2, int y2, int front, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void End() override
Update the system, if needed, at end of render process.
unsigned char * GetPixelData(int x, int y, int x2, int y2, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
void BlitToRenderFramebuffer(bool includeDepth)
Blit the currently bound read buffer to the renderbuffer.
static void SetGlobalMaximumNumberOfMultiSamples(int val)
Set/Get the maximum number of multisamples.
virtual float GetMaximumHardwareLineWidth()
Return the largest line width supported by the hardware.
vtkTextureUnitManager * GetTextureUnitManager()
Returns its texture unit manager object.
int GetDefaultTextureInternalFormat(int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB)
Get a mapping of vtk data types to native texture formats for this window we put this on the RenderWi...
void ActivateTexture(vtkTextureObject *)
Activate a texture unit for this texture.
vtkTextureObject * DrawPixelsTextureObject
vtkOpenGLFramebufferObject * DepthFramebuffer
bool GetUsingSRGBColorSpace()
Is this window/fo in sRGB colorspace.
int GetColorBufferSizes(int *rgba) override
Get the size of the color buffer.
int SetPixelData(int x, int y, int x2, int y2, unsigned char *data, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
void Render() override
Handle opengl specific code and calls superclass.
void UnregisterGraphicsResources(vtkGenericOpenGLResourceFreeCallback *cb)
void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, int bufferMode, int interpolation)
Blit a display buffer into a currently bound draw destination.
void Frame() override
A termination method performed at the end of the rendering process to do things like swapping buffers...
virtual bool IsPointSpriteBugPresent()
Returns true if driver has an EGL/OpenGL bug that makes vtkChartsCoreCxx-TestChartDoubleColors and ot...
void ReleaseRGBAPixelData(float *data) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
std::set< vtkGenericOpenGLResourceFreeCallback * > Resources
const char * GetRenderingBackend() override
What rendering backend has the user requested.
virtual void OpenGLInitContext()
vtkOpenGLQuadHelper * DepthBlitQuad
virtual void TextureDepthBlit(vtkTextureObject *source, int srcX, int srcY, int srcX2, int srcY2)
void WaitForCompletion() override
Block the thread until the actual rendering is finished().
virtual bool ResolveFlipRenderFramebuffer()
virtual void PushContext()
Ability to push and pop this window's context as the current context.
vtkOpenGLVertexBufferObjectCache * GetVBOCache()
Returns the VBO Cache.
float * GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
vtkOpenGLQuadHelper * FlipQuad
virtual void OpenGLInitState()
vtkOpenGLFramebufferObject * RenderFramebuffer
static int GetGlobalMaximumNumberOfMultiSamples()
Set/Get the maximum number of multisamples.
virtual void CreateAWindow()=0
Create a not-off-screen window.
void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX, int destY, int destWidth, int destHeight, int bufferMode, int interpolation)
Blit the currently bound read buffer to the renderbuffer.
virtual int ReadPixels(const vtkRecti &rect, int front, int glFormat, int glType, void *data, int right=0)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int SupportsOpenGL() override
Does this render window support OpenGL? 0-false, 1-true.
int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray *buffer) override
Set/Get the zbuffer data from an image.
virtual vtkMTimeType GetContextCreationTime()
Get the time when the OpenGL context was created.
const char * ReportCapabilities() override
Get report of capabilities for the render window.
int SetPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray *data, int front, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
int GetDepthBufferSize() override
Get the size of the depth buffer.
void SetFrameBlitModeToBlitToCurrent()
SetGet how to handle blits at the end of a Frame() call.
bool InitializeFromCurrentContext() override
Initialize the render window from the information associated with the currently activated OpenGL cont...
virtual vtkOpenGLState * GetState()
virtual bool SetSwapControl(int)
Set the number of vertical syncs required between frames.
vtkOpenGLBufferObject * TQuad2DVBO
~vtkOpenGLRenderWindow() override
void SetFrameBlitModeToNoBlit()
SetGet how to handle blits at the end of a Frame() call.
int CreateFramebuffers(int width, int height)
Create the offScreen framebuffer Return if the creation was successful or not.
vtkOpenGLShaderCache * GetShaderCache()
Returns an Shader Cache object.
virtual void OpenGLInit()
Initialize OpenGL for this window.
int SetZbufferData(int x1, int y1, int x2, int y2, float *buffer) override
Set/Get the zbuffer data from an image.
void BlitDisplayFramebuffer()
Blit a display framebuffer into a currently bound draw destination.
virtual void BlitDisplayFramebuffersToHardware()
void DeactivateTexture(vtkTextureObject *)
Deactivate a previously activated texture.
void RestoreGLState()
Restore OpenGL state at end of the rendering.
void GetOpenGLVersion(int &major, int &minor)
Get the major and minor version numbers of the OpenGL context we are using ala 3.2,...
void SaveGLState()
Query and save OpenGL state.
int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray *data, int front, int blend=0, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
int GetRGBACharPixelData(int x, int y, int x2, int y2, int front, vtkUnsignedCharArray *data, int right=0) override
Set/Get the pixel data of an image, transmitted as RGBARGBA...
float * GetZbufferData(int x1, int y1, int x2, int y2) override
Set/Get the zbuffer data from an image.
void SetFrameBlitModeToBlitToHardware()
SetGet how to handle blits at the end of a Frame() call.
int GetPixelData(int x, int y, int x2, int y2, int front, vtkUnsignedCharArray *data, int right) override
Set/Get the pixel data of an image, transmitted as RGBRGB...
virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void *data)
Replacement for the old glDrawPixels function.
vtkOpenGLQuadHelper * ResolveQuad
manage Shader Programs within a context
OpenGL state storage.
The VertexArrayObject class uses, or emulates, vertex array objects.
manage vertex buffer objects shared within a context
create a window for renderers to draw into
The ShaderProgram uses one or more Shader objects.
abstracts an OpenGL texture object.
allocate/free texture units.
handles properties associated with a texture map
Definition: vtkTexture.h:67
record modification and/or execution time
Definition: vtkTimeStamp.h:34
dynamic, self-adjusting array of unsigned char
window superclass for vtkRenderWindow
Definition: vtkWindow.h:37
virtual void MakeCurrent()
Make the window current.
Definition: vtkWindow.h:244
@ height
Definition: vtkX3D.h:254
@ data
Definition: vtkX3D.h:315
@ string
Definition: vtkX3D.h:490
int vtkTypeBool
Definition: vtkABI.h:64
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:270