VTK  9.3.20240420
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 "vtkWrappingHints.h" // For VTK_MARSHALAUTO
43#include <map> // for ivar
44#include <set> // for ivar
45#include <string> // for ivar
46
47VTK_ABI_NAMESPACE_BEGIN
48class vtkIdList;
51class vtkOpenGLHardwareSupport;
57class vtkTexture;
61class vtkOpenGLState;
62
63class VTKRENDERINGOPENGL2_EXPORT VTK_MARSHALAUTO vtkOpenGLRenderWindow : public vtkRenderWindow
64{
65public:
67 void PrintSelf(ostream& os, vtkIndent indent) override;
68
72 void Start() override;
73
78 void Frame() override;
79
83 const char* GetRenderingBackend() override;
84
86
92
94
99 unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
101 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
103 int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
105 int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
107
109
112 float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
114 int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
116 int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
117 int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
118 int right = 0) override;
119 void ReleaseRGBAPixelData(float* data) override;
120 unsigned char* GetRGBACharPixelData(
121 int x, int y, int x2, int y2, int front, int right = 0) override;
123 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
124 int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
125 int blend = 0, int right = 0) override;
126 int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
127 int blend = 0, int right = 0) override;
129
131
134 float* GetZbufferData(int x1, int y1, int x2, int y2) override;
135 int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
136 int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
137 int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
138 int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
140
145
150
155
159 int GetDepthBufferSize() override;
160
165
170 int GetColorBufferSizes(int* rgba) override;
171
177 int GetColorBufferInternalFormat(int attachmentPoint);
178
182 virtual void OpenGLInit();
183
184 // Initialize the state of OpenGL that VTK wants for this window
185 virtual void OpenGLInitState();
186
187 // Initialize VTK for rendering in a new OpenGL context
188 virtual void OpenGLInitContext();
189
195 void GetOpenGLVersion(int& major, int& minor);
196
201
206
211
213
216 vtkGetObjectMacro(RenderFramebuffer, vtkOpenGLFramebufferObject);
218
222 vtkGetObjectMacro(DisplayFramebuffer, vtkOpenGLFramebufferObject);
223
229
234 void WaitForCompletion() override;
235
239 virtual void DrawPixels(
240 int x1, int y1, int x2, int y2, int numComponents, int dataType, void* data);
241
246 virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin,
247 int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents,
248 int dataType, void* data);
249
254 virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void* data);
255
259 virtual float GetMaximumHardwareLineWidth() { return this->MaximumHardwareLineWidth; }
260
267 virtual bool IsPointSpriteBugPresent() { return false; }
268
275 int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB);
276
282 std::string GetOpenGLSupportMessage() { return this->OpenGLSupportMessage; }
283
287 int SupportsOpenGL() override;
288
292 const char* ReportCapabilities() override;
293
300 virtual void Initialize() {}
301
302 std::set<vtkGenericOpenGLResourceFreeCallback*> Resources;
303
305 {
306 std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
307 if (it == this->Resources.end())
308 {
309 this->Resources.insert(cb);
310 }
311 }
312
314 {
315 std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
316 if (it != this->Resources.end())
317 {
318 this->Resources.erase(it);
319 }
320 }
321
331 virtual void PushContext() { this->MakeCurrent(); }
332 virtual void PopContext() {}
333
339
349 virtual bool SetSwapControl(int) { return false; }
350
351 // Get the state object used to keep track of
352 // OpenGL state
353 virtual vtkOpenGLState* GetState() { return this->State; }
354
355 // Get a VBO that can be shared by many
356 // It consists of normalized display
357 // coordinates for a quad and tcoords
359
360 // Activate and return thje texture unit for a generic 2d 64x64
361 // float greyscale noise texture ranging from 0 to 1. The texture is
362 // a hard-coded blue noise texture. This texture unit will automatically
363 // be deactivated at the end of the render process.
365
369 void End() override;
370
374 void Render() override;
375
380 void StereoMidpoint() override;
381
382 // does VTKs framebuffer require resolving for reading pixels
384
390
396
402
406 void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX,
407 int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
408
410
414 void BlitToRenderFramebuffer(bool includeDepth);
415 void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX,
416 int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
418
424 {
425 BlitToHardware, // hardware buffers
426 BlitToCurrent, // currently bound draw framebuffer, without depth buffer
427 BlitToCurrentWithDepth, // currently bound draw framebuffer, including depth buffer
428 NoBlit // no blit, GUI or external code will handle the blit
429 };
430
432
457 vtkSetClampMacro(FrameBlitMode, FrameBlitModes, BlitToHardware, NoBlit);
458 vtkGetMacro(FrameBlitMode, FrameBlitModes);
459 void SetFrameBlitModeToBlitToHardware() { this->SetFrameBlitMode(BlitToHardware); }
460 void SetFrameBlitModeToBlitToCurrent() { this->SetFrameBlitMode(BlitToCurrent); }
462 {
463 this->SetFrameBlitMode(BlitToCurrentWithDepth);
464 }
465 void SetFrameBlitModeToNoBlit() { this->SetFrameBlitMode(NoBlit); }
467
469
472 vtkSetMacro(FramebufferFlipY, bool);
473 vtkGetMacro(FramebufferFlipY, bool);
474 vtkBooleanMacro(FramebufferFlipY, bool);
476
478
481 vtkSetMacro(RenderBufferTargetDepthSize, int);
482 vtkGetMacro(RenderBufferTargetDepthSize, int);
484
486 // copy depth values from a source framebuffer to a destination framebuffer
487 // using texture maps to do the copy. The source framebufferobject must be texture
488 // backed. This method is designed to work around issues with trying to blit depth
489 // values between framebuffers that have different depth formats.
490
491 // blit entire source texture to active viewport
493
494 // blit specified source texels to active viewport
495 virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2);
496
497 // blit specified source texels to specified viewport
498 virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2,
499 int destX, int destY, int destX2, int destY2);
501
502protected:
505
506 // blits the display buffers to the appropriate hardware buffers
508
509 // when frame is called, at the end blit to the hardware buffers
511
512 // a FSQ we use to resolve MSAA that handles gamma
514
515 // a FSQ we use to blit depth values
517
518 // a FSQ we use to flip framebuffer texture
520
521 // a FSQ we use to read depth component on platforms with OpenGL ES implementations
522 // because `glReadPixels` cannot be used to read GL_DEPTH_COMPONENT
524
525 // flip quad helpers Y tcoord
527
528 // resolve and flip renderframebuffer as needed
529 // when copying to displayframebuffer. Returns
530 // true if the color buffer was copied.
532
533 // On GLES, the depth attachment buffer cannot be downloaded from
534 // the GPU with `glReadPixels`.
535 // This method reads the depth buffer bits.
536 // The depth attachment size can be 8,16,24 or 32. The values are split into 4 8-bit numbers.
537 // These are stored in the form of an RGBA color attachment in DepthFrameBuffer.
538 // `glReadPixels` can read that RGBA format and reconstruct full 8,16,24 or 32-bit integer
539 // followed by scaling down to 0-1.
540 bool ReadDepthComponent(int depthSize);
541
542 // used in testing for opengl support
543 // in the SupportsOpenGL() method
547
548 virtual int ReadPixels(
549 const vtkRecti& rect, int front, int glFormat, int glType, void* data, int right = 0);
550
559 int CreateFramebuffers(int width, int height);
562
563 // used when we need to resolve a multisampled
564 // framebuffer
566
567 // used when we need to read depth component
568 // with OpenGL ES 3
570
574 virtual void CreateAWindow() = 0;
575
579 virtual void DestroyWindow() = 0;
580
585
590
591 std::map<std::string, int> GLStateIntegers;
592
597
599
601
602 bool Initialized; // ensure glewinit has been called
603 bool GlewInitValid; // Did glewInit initialize with a valid state?
604
606
608
609 // used for fast quad rendering
611
612 // noise texture
614
616
617 // keep track of in case we need to recreate the framebuffer
619
620 // how much bits to use for depth of created Framebuffers
622
623 int ScreenSize[2];
624
625private:
627 void operator=(const vtkOpenGLRenderWindow&) = delete;
628
629 // Keeping `State` private so the only way to access it is through
630 // `this->GetState()`.
631 vtkOpenGLState* State;
632};
633
634VTK_ABI_NAMESPACE_END
635#endif
dynamic, self-adjusting array of float
list of point or cell ids
Definition vtkIdList.h:133
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...
vtkTextureUnitManager * GetTextureUnitManager()
Returns its texture unit manager object.
bool ReadDepthComponent(int depthSize)
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.
const char * GetRenderingBackend() override
What rendering backend has the user requested.
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...
float * GetZbufferData(int x1, int y1, int x2, int y2) override
Set/Get the zbuffer data from an image.
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.
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... front in this context indicates that the...
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.
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... front in this context indicates that the...
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...
vtkOpenGLBufferObject * GetTQuad2DVBO()
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
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.
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...
vtkOpenGLQuadHelper * FlipQuad
virtual void OpenGLInitState()
vtkOpenGLFramebufferObject * RenderFramebuffer
static int GetGlobalMaximumNumberOfMultiSamples()
Set/Get the maximum number of multisamples.
virtual vtkOpenGLState * GetState()
virtual void CreateAWindow()=0
Create a not-off-screen window.
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...
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.
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... front in this context indicates that the...
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 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.
const char * ReportCapabilities() override
Get report of capabilities for the render window.
void SetFrameBlitModeToNoBlit()
SetGet how to handle blits at the end of a Frame() call.
vtkOpenGLShaderCache * GetShaderCache()
Returns an Shader Cache object.
vtkOpenGLVertexBufferObjectCache * GetVBOCache()
Returns the VBO Cache.
int CreateFramebuffers(int width, int height)
Create the offScreen framebuffers or resize them if they are already created.
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...
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... front in this context indicates that the...
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
dynamic, self-adjusting array of unsigned char
window superclass for vtkRenderWindow
Definition vtkWindow.h:48
virtual void MakeCurrent()
Make the window current.
Definition vtkWindow.h:255
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
#define VTK_MARSHALAUTO