VTK  9.7.20260908
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
34
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;
58class vtkTexture;
62class vtkOpenGLState;
64
65class VTKRENDERINGOPENGL2_EXPORT VTK_MARSHALAUTO vtkOpenGLRenderWindow : public vtkRenderWindow
66{
67public:
69#if !(defined(__APPLE__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__))
73#endif
74 void PrintSelf(ostream& os, vtkIndent indent) override;
75
79 void Start() override;
80
85 void Frame() override;
86
90 const char* GetRenderingBackend() override;
91
93
99
101
106 static void SetUseGenericOpenGLRenderWindow(bool val);
109
111
116 unsigned char* GetPixelData(int x, int y, int x2, int y2, int front, int right) override;
118 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right) override;
120 int x, int y, int x2, int y2, unsigned char* data, int front, int right) override;
122 int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front, int right) override;
124
126
129 float* GetRGBAPixelData(int x, int y, int x2, int y2, int front, int right = 0) override;
131 int x, int y, int x2, int y2, int front, vtkFloatArray* data, int right = 0) override;
133 int x, int y, int x2, int y2, float* data, int front, int blend = 0, int right = 0) override;
134 int SetRGBAPixelData(int x, int y, int x2, int y2, vtkFloatArray* data, int front, int blend = 0,
135 int right = 0) override;
136 void ReleaseRGBAPixelData(float* data) override;
137 unsigned char* GetRGBACharPixelData(
138 int x, int y, int x2, int y2, int front, int right = 0) override;
140 int x, int y, int x2, int y2, int front, vtkUnsignedCharArray* data, int right = 0) override;
141 int SetRGBACharPixelData(int x, int y, int x2, int y2, unsigned char* data, int front,
142 int blend = 0, int right = 0) override;
143 int SetRGBACharPixelData(int x, int y, int x2, int y2, vtkUnsignedCharArray* data, int front,
144 int blend = 0, int right = 0) override;
146
148
151 float* GetZbufferData(int x1, int y1, int x2, int y2) override;
152 int GetZbufferData(int x1, int y1, int x2, int y2, float* z) override;
153 int GetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
154 int SetZbufferData(int x1, int y1, int x2, int y2, float* buffer) override;
155 int SetZbufferData(int x1, int y1, int x2, int y2, vtkFloatArray* buffer) override;
157
162
167
172
176 int GetDepthBufferSize() override;
177
182
187 int GetColorBufferSizes(int* rgba) override;
188
194 int GetColorBufferInternalFormat(int attachmentPoint);
195
199 virtual void OpenGLInit();
200
201 // Initialize the state of OpenGL that VTK wants for this window
202 virtual void OpenGLInitState();
203
204 // Initialize VTK for rendering in a new OpenGL context
205 virtual void OpenGLInitContext();
206
212 void GetOpenGLVersion(int& major, int& minor);
213
218
223
228
233
235
240
245
251
257
262 void WaitForCompletion() override;
263
267 virtual void DrawPixels(
268 int x1, int y1, int x2, int y2, int numComponents, int dataType, void* data);
269
274 virtual void DrawPixels(int dstXmin, int dstYmin, int dstXmax, int dstYmax, int srcXmin,
275 int srcYmin, int srcXmax, int srcYmax, int srcWidth, int srcHeight, int numComponents,
276 int dataType, void* data);
277
282 virtual void DrawPixels(int srcWidth, int srcHeight, int numComponents, int dataType, void* data);
283
288
295 virtual bool IsPointSpriteBugPresent() { return false; }
296
307
314 int vtktype, int numComponents, bool needInteger, bool needFloat, bool needSRGB);
315
321 std::string GetOpenGLSupportMessage() { return this->OpenGLSupportMessage; }
322
326 int SupportsOpenGL() override;
327
331 const char* ReportCapabilities() override;
332
339 void Initialize() override {}
340
341 std::set<vtkGenericOpenGLResourceFreeCallback*> Resources;
342
344 {
345 std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
346 if (it == this->Resources.end())
347 {
348 this->Resources.insert(cb);
349 }
350 }
351
353 {
354 std::set<vtkGenericOpenGLResourceFreeCallback*>::iterator it = this->Resources.find(cb);
355 if (it != this->Resources.end())
356 {
357 this->Resources.erase(it);
358 }
359 }
360
370 virtual void PushContext() { this->MakeCurrent(); }
371 virtual void PopContext() {}
372
378
388 virtual bool SetSwapControl(int) { return false; }
389
390 // Get the state object used to keep track of
391 // OpenGL state
392 virtual vtkOpenGLState* GetState() { return this->State; }
393
394 // Get a VBO that can be shared by many
395 // It consists of normalized display
396 // coordinates for a quad and tcoords
398
399 // Activate and return thje texture unit for a generic 2d 64x64
400 // float greyscale noise texture ranging from 0 to 1. The texture is
401 // a hard-coded blue noise texture. This texture unit will automatically
402 // be deactivated at the end of the render process.
404
408 void End() override;
409
413 void Render() override;
414
419 void StereoMidpoint() override;
420
421 // does VTKs framebuffer require resolving for reading pixels
423
429
435
441
445 void BlitDisplayFramebuffer(int right, int srcX, int srcY, int srcWidth, int srcHeight, int destX,
446 int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
447
449
453 void BlitToRenderFramebuffer(bool includeDepth);
454 void BlitToRenderFramebuffer(int srcX, int srcY, int srcWidth, int srcHeight, int destX,
455 int destY, int destWidth, int destHeight, int bufferMode, int interpolation);
457
463 {
464 BlitToHardware, // hardware buffers
465 BlitToCurrent, // currently bound draw framebuffer, without depth buffer
466 BlitToCurrentWithDepth, // currently bound draw framebuffer, including depth buffer
467 NoBlit // no blit, GUI or external code will handle the blit
468 };
469
471
506
508
511 vtkSetMacro(FramebufferFlipY, bool);
512 vtkGetMacro(FramebufferFlipY, bool);
513 vtkBooleanMacro(FramebufferFlipY, bool);
515
517
523
525 // copy depth values from a source framebuffer to a destination framebuffer
526 // using texture maps to do the copy. The source framebufferobject must be texture
527 // backed. This method is designed to work around issues with trying to blit depth
528 // values between framebuffers that have different depth formats.
529
530 // blit entire source texture to active viewport
532
533 // blit specified source texels to active viewport
534 virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2);
535
536 // blit specified source texels to specified viewport
537 virtual void TextureDepthBlit(vtkTextureObject* source, int srcX, int srcY, int srcX2, int srcY2,
538 int destX, int destY, int destX2, int destY2);
540
541 typedef void (*VTKOpenGLAPIProc)();
542 typedef VTKOpenGLAPIProc (*VTKOpenGLLoaderFunction)(void* userptr, const char* name);
553 void SetOpenGLSymbolLoader(VTKOpenGLLoaderFunction loader, void* userData);
554
570 void SetOpenGLSymbolLoader2(long long toolGetProcAddressFunc, long long glLibHandle);
571
576
581
582protected:
585
586 // blits the display buffers to the appropriate hardware buffers
588
589 // when frame is called, at the end blit to the hardware buffers
591
592 // a FSQ we use to resolve MSAA that handles gamma
594
595 // a FSQ we use to blit depth values
597
598 // a FSQ we use to flip framebuffer texture
600
601 // a FSQ we use to read depth component on platforms with OpenGL ES implementations
602 // because `glReadPixels` cannot be used to read GL_DEPTH_COMPONENT
604
605 // flip quad helpers Y tcoord
607
608 // resolve and flip renderframebuffer as needed
609 // when copying to displayframebuffer. Returns
610 // true if the color buffer was copied.
612
613 // On GLES, the depth attachment buffer cannot be downloaded from
614 // the GPU with `glReadPixels`.
615 // This method reads the depth buffer bits.
616 // The depth attachment size can be 8,16,24 or 32. The values are split into 4 8-bit numbers.
617 // These are stored in the form of an RGBA color attachment in DepthFrameBuffer.
618 // `glReadPixels` can read that RGBA format and reconstruct full 8,16,24 or 32-bit integer
619 // followed by scaling down to 0-1.
620 bool ReadDepthComponent(int depthSize);
621
622 // used in testing for opengl support
623 // in the SupportsOpenGL() method
627
628 virtual int ReadPixels(
629 const vtkRecti& rect, int front, int glFormat, int glType, void* data, int right = 0);
630
639 int CreateFramebuffers(int width, int height);
642
643 // used when we need to resolve a multisampled
644 // framebuffer
646
647 // used when we need to read depth component
648 // with OpenGL ES 3
650
654 virtual void CreateAWindow() = 0;
655
659 virtual void DestroyWindow() = 0;
660
661 std::map<std::string, int> GLStateIntegers;
662
667
669
671
673
675
676 // used for fast quad rendering
678
679 // noise texture
681
683
684 // keep track of in case we need to recreate the framebuffer
686
687 // how much bits to use for depth of created Framebuffers
689
691
692 struct
693 {
695 void* UserData = nullptr;
696 } SymbolLoader;
697
698 typedef VTKOpenGLAPIProc (*VTKOpenGLGetProcAddress)(const char* name);
700 {
702 void* libHandle = nullptr;
703 } FuncResolverState;
704
705private:
707 void operator=(const vtkOpenGLRenderWindow&) = delete;
708
709 // Keeping `State` private so the only way to access it is through
710 // `this->GetState()`.
711 vtkOpenGLState* State;
712};
713#if !(defined(__APPLE__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__))
714#define vtkOpenGLRenderWindow_OVERRIDE_ATTRIBUTES vtkOpenGLRenderWindow::CreateOverrideAttributes()
715#endif
716VTK_ABI_NAMESPACE_END
717#endif
dynamic, self-adjusting array of float
list of point or cell ids
Definition vtkIdList.h:135
a simple class to control print indentation
Definition vtkIndent.h:108
manage texture-buffer-backed data arrays shared within a context
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 SetOpenGLSymbolLoader2(long long toolGetProcAddressFunc, long long glLibHandle)
Provide an indirect function pointer which can load OpenGL core/extension functions.
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.
void Initialize() override
Initialize the rendering window.
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...
void SetOpenGLSymbolLoader(VTKOpenGLLoaderFunction loader, void *userData)
Provide a function pointer which can load OpenGL core/extension functions.
int GetTextureUnitForTexture(vtkTextureObject *)
Get the texture unit for a given texture object.
VTKOpenGLAPIProc(* VTKOpenGLGetProcAddress)(const char *name)
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...
static void SetUseGenericOpenGLRenderWindow(bool val)
When set, New() returns a vtkGenericOpenGLRenderWindow instead of trying hardware-specific backends (...
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...
VTKOpenGLAPIProc(* VTKOpenGLLoaderFunction)(void *userptr, const char *name)
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...
static vtkOpenGLRenderWindow * New()
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
VTKOpenGLLoaderFunction LoadFunction
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.
virtual void SetFrameBlitMode(FrameBlitModes)
SetGet how to handle blits at the end of a Frame() call.
int SupportsOpenGL() override
Does this render window support OpenGL?
vtkOpenGLArrayTextureBufferCache * GetArrayTextureBufferCache()
Returns the texture-buffer cache used by the vertex-pulling mappers.
static bool GetUseGenericOpenGLRenderWindow()
When set, New() returns a vtkGenericOpenGLRenderWindow instead of trying hardware-specific backends (...
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...
static vtkOverrideAttribute * CreateOverrideAttributes()
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.
bool IsPrimIDBugPresent()
On gl_PrimitiveID, the spec says it is a counter that is incremented after every individual point,...
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
Attribute for vtkObjectFactory overrides.
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:168
record modification and/or execution time
dynamic, self-adjusting array of unsigned char
virtual void MakeCurrent()
Make the window current.
Definition vtkWindow.h:279
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:318
#define VTK_MARSHALAUTO
#define VTK_NEWINSTANCE