VTK  9.3.20240328
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
35 #ifndef vtkOpenGLRenderWindow_h
36 #define vtkOpenGLRenderWindow_h
37 
38 #include "vtkRect.h" // for vtkRecti
39 #include "vtkRenderWindow.h"
40 #include "vtkRenderingOpenGL2Module.h" // For export macro
41 #include "vtkType.h" // for ivar
42 #include <map> // for ivar
43 #include <set> // for ivar
44 #include <string> // for ivar
45 
46 VTK_ABI_NAMESPACE_BEGIN
47 class vtkIdList;
50 class vtkOpenGLHardwareSupport;
55 class vtkShaderProgram;
56 class vtkTexture;
57 class vtkTextureObject;
60 class vtkOpenGLState;
61 
62 class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLRenderWindow : public vtkRenderWindow
63 {
64 public:
66  void PrintSelf(ostream& os, vtkIndent indent) override;
67 
71  void Start() override;
72 
77  void Frame() override;
78 
82  const char* GetRenderingBackend() override;
83 
85 
91 
93 
98  unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
100  int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
102  int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
104  int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
106 
108 
111  float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
113  int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
115  int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
116  int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
117  int right = 0) override;
118  void ReleaseRGBAPixelData(float* data) override;
119  unsigned char* GetRGBACharPixelData(
120  int x, int y, int x2, int y2, int front, int right = 0) override;
122  int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
123  int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
124  int blend = 0, int right = 0) override;
125  int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
126  int blend = 0, int right = 0) override;
128 
130 
133  float* GetZbufferData(int x1, int y1, int x2, int y2) override;
134  int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
135  int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
136  int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
137  int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
139 
144 
149 
154 
158  int GetDepthBufferSize() override;
159 
164 
169  int GetColorBufferSizes(int* rgba) override;
170 
176  int GetColorBufferInternalFormat(int attachmentPoint);
177 
181  virtual void OpenGLInit();
182 
183  // Initialize the state of OpenGL that VTK wants for this window
184  virtual void OpenGLInitState();
185 
186  // Initialize VTK for rendering in a new OpenGL context
187  virtual void OpenGLInitContext();
188 
194  void GetOpenGLVersion(int& major, int& minor);
195 
200 
205 
210 
212 
215  vtkGetObjectMacro(RenderFramebuffer, vtkOpenGLFramebufferObject);
217 
221  vtkGetObjectMacro(DisplayFramebuffer, vtkOpenGLFramebufferObject);
222 
228 
233  void WaitForCompletion() override;
234 
238  virtual void DrawPixels(
239  int x1, int y1, int x2, int y2, int numComponents, int dataType, void* data);
240 
245  virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin,
246  int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents,
247  int dataType, void* data);
248 
253  virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void* data);
254 
258  virtual float GetMaximumHardwareLineWidth() { return this->MaximumHardwareLineWidth; }
259 
266  virtual bool IsPointSpriteBugPresent() { return false; }
267 
274  int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB);
275 
281  std::string GetOpenGLSupportMessage() { return this->OpenGLSupportMessage; }
282 
286  int SupportsOpenGL() override;
287 
291  const char* ReportCapabilities() override;
292 
299  virtual void Initialize() {}
300 
301  std::set<vtkGenericOpenGLResourceFreeCallback*> Resources;
302 
304  {
305  std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
306  if (it == this->Resources.end())
307  {
308  this->Resources.insert(cb);
309  }
310  }
311 
313  {
314  std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
315  if (it != this->Resources.end())
316  {
317  this->Resources.erase(it);
318  }
319  }
320 
330  virtual void PushContext() { this->MakeCurrent(); }
331  virtual void PopContext() {}
332 
338 
348  virtual bool SetSwapControl(int) { return false; }
349 
350  // Get the state object used to keep track of
351  // OpenGL state
352  virtual vtkOpenGLState* GetState() { return this->State; }
353 
354  // Get a VBO that can be shared by many
355  // It consists of normalized display
356  // coordinates for a quad and tcoords
358 
359  // Activate and return thje texture unit for a generic 2d 64x64
360  // float greyscale noise texture ranging from 0 to 1. The texture is
361  // a hard-coded blue noise texture. This texture unit will automatically
362  // be deactivated at the end of the render process.
364 
368  void End() override;
369 
373  void Render() override;
374 
379  void StereoMidpoint() override;
380 
381  // does VTKs framebuffer require resolving for reading pixels
383 
389 
395 
401 
405  void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX,
406  int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
407 
409 
413  void BlitToRenderFramebuffer(bool includeDepth);
414  void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX,
415  int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
417 
423  {
424  BlitToHardware, // hardware buffers
425  BlitToCurrent, // currently bound draw framebuffer, without depth buffer
426  BlitToCurrentWithDepth, // currently bound draw framebuffer, including depth buffer
427  NoBlit // no blit, GUI or external code will handle the blit
428  };
429 
431 
456  vtkSetClampMacro(FrameBlitMode, FrameBlitModes, BlitToHardware, NoBlit);
457  vtkGetMacro(FrameBlitMode, FrameBlitModes);
458  void SetFrameBlitModeToBlitToHardware() { this->SetFrameBlitMode(BlitToHardware); }
459  void SetFrameBlitModeToBlitToCurrent() { this->SetFrameBlitMode(BlitToCurrent); }
461  {
462  this->SetFrameBlitMode(BlitToCurrentWithDepth);
463  }
464  void SetFrameBlitModeToNoBlit() { this->SetFrameBlitMode(NoBlit); }
466 
468 
471  vtkSetMacro(FramebufferFlipY, bool);
472  vtkGetMacro(FramebufferFlipY, bool);
473  vtkBooleanMacro(FramebufferFlipY, bool);
475 
477 
480  vtkSetMacro(RenderBufferTargetDepthSize, int);
481  vtkGetMacro(RenderBufferTargetDepthSize, int);
483 
485  // copy depth values from a source framebuffer to a destination framebuffer
486  // using texture maps to do the copy. The source framebufferobject must be texture
487  // backed. This method is designed to work around issues with trying to blit depth
488  // values between framebuffers that have different depth formats.
489 
490  // blit entire source texture to active viewport
492 
493  // blit specified source texels to active viewport
494  virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2);
495 
496  // blit specified source texels to specified viewport
497  virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2,
498  int destX, int destY, int destX2, int destY2);
500 
501 protected:
504 
505  // blits the display buffers to the appropriate hardware buffers
507 
508  // when frame is called, at the end blit to the hardware buffers
510 
511  // a FSQ we use to resolve MSAA that handles gamma
513 
514  // a FSQ we use to blit depth values
516 
517  // a FSQ we use to flip framebuffer texture
519 
520  // a FSQ we use to read depth component on platforms with OpenGL ES implementations
521  // because `glReadPixels` cannot be used to read GL_DEPTH_COMPONENT
523 
524  // flip quad helpers Y tcoord
526 
527  // resolve and flip renderframebuffer as needed
528  // when copying to displayframebuffer. Returns
529  // true if the color buffer was copied.
531 
532  // On GLES, the depth attachment buffer cannot be downloaded from
533  // the GPU with `glReadPixels`.
534  // This method reads the depth buffer bits.
535  // The depth attachment size can be 8,16,24 or 32. The values are split into 4 8-bit numbers.
536  // These are stored in the form of an RGBA color attachment in DepthFrameBuffer.
537  // `glReadPixels` can read that RGBA format and reconstruct full 8,16,24 or 32-bit integer
538  // followed by scaling down to 0-1.
539  bool ReadDepthComponent(int depthSize);
540 
541  // used in testing for opengl support
542  // in the SupportsOpenGL() method
546 
547  virtual int ReadPixels(
548  const vtkRecti& rect, int front, int glFormat, int glType, void* data, int right = 0);
549 
558  int CreateFramebuffers(int width, int height);
561 
562  // used when we need to resolve a multisampled
563  // framebuffer
565 
566  // used when we need to read depth component
567  // with OpenGL ES 3
569 
573  virtual void CreateAWindow() = 0;
574 
578  virtual void DestroyWindow() = 0;
579 
583  void SaveGLState();
584 
589 
590  std::map<std::string, int> GLStateIntegers;
591 
596 
598 
600 
601  bool Initialized; // ensure glewinit has been called
602  bool GlewInitValid; // Did glewInit initialize with a valid state?
603 
605 
607 
608  // used for fast quad rendering
610 
611  // noise texture
613 
615 
616  // keep track of in case we need to recreate the framebuffer
618 
619  // how much bits to use for depth of created Framebuffers
621 
622  int ScreenSize[2];
623 
624 private:
626  void operator=(const vtkOpenGLRenderWindow&) = delete;
627 
628  // Keeping `State` private so the only way to access it is through
629  // `this->GetState()`.
630  vtkOpenGLState* State;
631 };
632 
633 VTK_ABI_NAMESPACE_END
634 #endif
dynamic, self-adjusting array of float
list of point or cell ids
Definition: vtkIdList.h:132
a simple class to control print indentation
Definition: vtkIndent.h:108
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 BlitDisplayFramebufferColorAndDepth()
Blit a display framebuffer into a currently bound draw destination, color and depth.
void SetFrameBlitModeToNoBlit()
SetGet how to handle blits at the end of a Frame() call.
int CreateFramebuffers(int width, int height)
Create the offScreen framebuffers or resize them if they are already created.
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, color only.
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...
void SetFrameBlitModeToBlitToCurrentWithDepth()
SetGet how to handle blits at the end of a Frame() call.
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:167
record modification and/or execution time
Definition: vtkTimeStamp.h:44
dynamic, self-adjusting array of unsigned char
window superclass for vtkRenderWindow
Definition: vtkWindow.h:47
virtual void MakeCurrent()
Make the window current.
Definition: vtkWindow.h:254
@ 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