VTK  9.1.20211230
vtkTextureObject.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkTextureObject.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 =========================================================================*/
43 #ifndef vtkTextureObject_h
44 #define vtkTextureObject_h
45 
46 #include "vtkObject.h"
47 #include "vtkRenderingOpenGL2Module.h" // For export macro
48 #include "vtkWeakPointer.h" // for render context
49 
51 class vtkOpenGLHelper;
55 class vtkShaderProgram;
56 class vtkWindow;
58 
59 class VTKRENDERINGOPENGL2_EXPORT vtkTextureObject : public vtkObject
60 {
61 public:
62  // DepthTextureCompareFunction values.
63  enum
64  {
65  Lequal = 0, // r=R<=Dt ? 1.0 : 0.0
66  Gequal, // r=R>=Dt ? 1.0 : 0.0
67  Less, // r=R<D_t ? 1.0 : 0.0
68  Greater, // r=R>Dt ? 1.0 : 0.0
69  Equal, // r=R==Dt ? 1.0 : 0.0
70  NotEqual, // r=R!=Dt ? 1.0 : 0.0
71  AlwaysTrue, // r=1.0 // WARNING "Always" is macro defined in X11/X.h...
72  Never, // r=0.0
73  NumberOfDepthTextureCompareFunctions
74  };
75 
76 // ClampToBorder is not supported in ES 2.0
77 // Wrap values.
78 #ifndef GL_ES_VERSION_3_0
79  enum { ClampToEdge = 0, Repeat, MirroredRepeat, ClampToBorder, NumberOfWrapModes };
80 #else
81  enum
82  {
83  ClampToEdge = 0,
84  Repeat,
85  MirroredRepeat,
86  NumberOfWrapModes
87  };
88 #endif
89 
90  // MinificationFilter values.
91  enum
92  {
93  Nearest = 0,
99  NumberOfMinificationModes
100  };
101 
102  // depth/color format
103  enum
104  {
105  Native = 0, // will try to match with the depth buffer format.
112  NumberOfDepthFormats
113  };
114 
116  vtkTypeMacro(vtkTextureObject, vtkObject);
117  void PrintSelf(ostream& os, vtkIndent indent) override;
118 
120 
132 
134 
138  vtkGetMacro(Width, unsigned int);
139  vtkGetMacro(Height, unsigned int);
140  vtkGetMacro(Depth, unsigned int);
141  vtkGetMacro(Samples, unsigned int);
142  vtkGetMacro(Components, int);
143  unsigned int GetTuples() { return this->Width * this->Height * this->Depth; }
145 
146  vtkGetMacro(NumberOfDimensions, int);
147 
148  // for MSAA textures set the number of samples
149  vtkSetMacro(Samples, unsigned int);
150 
152 
155  vtkGetMacro(Target, unsigned int);
157 
159 
162  vtkGetMacro(Handle, unsigned int);
164 
169 
171 
176  void Bind();
178 
182  virtual void Activate();
183 
187  void Deactivate();
188 
193 
198  bool IsBound();
199 
207 
209 
213  vtkSetMacro(AutoParameters, int);
214  vtkGetMacro(AutoParameters, int);
215  vtkBooleanMacro(AutoParameters, int);
217 
223  unsigned int width, unsigned int height, int numComps, int dataType, void* data);
224 
231  unsigned int width, unsigned int height, int internalFormat, int rawType, void* raw);
232 
238  unsigned int numValues, int numComps, int dataType, vtkOpenGLBufferObject* bo);
239 
246  unsigned int width, unsigned int height, int numComps, int dataType, void* data[6]);
247 
258  bool Create1D(int numComps, vtkPixelBufferObject* pbo, bool shaderSupportsTextureInt);
259 
263  bool Create1DFromRaw(unsigned int width, int numComps, int dataType, void* data);
264 
271  bool Create2D(unsigned int width, unsigned int height, int numComps, vtkPixelBufferObject* pbo,
272  bool shaderSupportsTextureInt);
273 
280  bool Create3D(unsigned int width, unsigned int height, unsigned int depth, int numComps,
281  vtkPixelBufferObject* pbo, bool shaderSupportsTextureInt);
282 
287  bool Create3DFromRaw(unsigned int width, unsigned int height, unsigned int depth, int numComps,
288  int dataType, void* data);
289 
296  bool AllocateProxyTexture3D(unsigned int const width, unsigned int const height,
297  unsigned int const depth, int const numComps, int const dataType);
298 
306  vtkPixelBufferObject* Download(unsigned int target, unsigned int level);
307 
313  unsigned int width, unsigned int height, int internalFormat, vtkPixelBufferObject* pbo);
314 
318  bool AllocateDepth(unsigned int width, unsigned int height, int internalFormat);
319 
323  bool AllocateDepthStencil(unsigned int width, unsigned int height);
324 
329  bool Allocate1D(unsigned int width, int numComps, int vtkType);
330 
336  unsigned int width, unsigned int height, int numComps, int vtkType, int level = 0);
337 
343  unsigned int width, unsigned int height, unsigned int depth, int numComps, int vtkType);
344 
346 
349  bool Create2D(unsigned int width, unsigned int height, int numComps, int vtktype, bool)
350  {
351  return this->Allocate2D(width, height, numComps, vtktype);
352  }
353  bool Create3D(
354  unsigned int width, unsigned int height, unsigned int depth, int numComps, int vtktype, bool)
355  {
356  return this->Allocate3D(width, height, depth, numComps, vtktype);
357  }
359 
364 
366 
369  int GetDataType(int vtk_scalar_type);
370  void SetDataType(unsigned int glType);
371  int GetDefaultDataType(int vtk_scalar_type);
373 
375 
380  unsigned int GetInternalFormat(int vtktype, int numComps, bool shaderSupportsTextureInt);
381  void SetInternalFormat(unsigned int glInternalFormat);
382  unsigned int GetDefaultInternalFormat(int vtktype, int numComps, bool shaderSupportsTextureInt);
384 
386 
391  unsigned int GetFormat(int vtktype, int numComps, bool shaderSupportsTextureInt);
392  void SetFormat(unsigned int glFormat);
393  unsigned int GetDefaultFormat(int vtktype, int numComps, bool shaderSupportsTextureInt);
395 
405 
406  unsigned int GetMinificationFilterMode(int vtktype);
407  unsigned int GetMagnificationFilterMode(int vtktype);
408  unsigned int GetWrapSMode(int vtktype);
409  unsigned int GetWrapTMode(int vtktype);
410  unsigned int GetWrapRMode(int vtktype);
411 
413 
419  vtkSetMacro(RequireDepthBufferFloat, bool);
420  vtkGetMacro(RequireDepthBufferFloat, bool);
421  vtkGetMacro(SupportsDepthBufferFloat, bool);
423 
425 
431  vtkSetMacro(RequireTextureFloat, bool);
432  vtkGetMacro(RequireTextureFloat, bool);
433  vtkGetMacro(SupportsTextureFloat, bool);
435 
437 
443  vtkSetMacro(RequireTextureInteger, bool);
444  vtkGetMacro(RequireTextureInteger, bool);
445  vtkGetMacro(SupportsTextureInteger, bool);
447 
449 
459  vtkGetMacro(WrapS, int);
460  vtkSetMacro(WrapS, int);
462 
464 
474  vtkGetMacro(WrapT, int);
475  vtkSetMacro(WrapT, int);
477 
479 
489  vtkGetMacro(WrapR, int);
490  vtkSetMacro(WrapR, int);
492 
494 
507  vtkGetMacro(MinificationFilter, int);
508  vtkSetMacro(MinificationFilter, int);
510 
512 
519  vtkGetMacro(MagnificationFilter, int);
520  vtkSetMacro(MagnificationFilter, int);
522 
527  void SetLinearMagnification(bool val) { this->SetMagnificationFilter(val ? Linear : Nearest); }
528 
529  bool GetLinearMagnification() { return this->MagnificationFilter == Linear; }
530 
532 
537  vtkSetVector4Macro(BorderColor, float);
538  vtkGetVector4Macro(BorderColor, float);
540 
542 
546  vtkSetMacro(MinLOD, float);
547  vtkGetMacro(MinLOD, float);
549 
551 
555  vtkSetMacro(MaxLOD, float);
556  vtkGetMacro(MaxLOD, float);
558 
560 
565  vtkSetMacro(BaseLevel, int);
566  vtkGetMacro(BaseLevel, int);
568 
570 
575  vtkSetMacro(MaxLevel, int);
576  vtkGetMacro(MaxLevel, int);
578 
580 
590  vtkGetMacro(DepthTextureCompare, bool);
591  vtkSetMacro(DepthTextureCompare, bool);
593 
595 
615  vtkGetMacro(DepthTextureCompareFunction, int);
616  vtkSetMacro(DepthTextureCompareFunction, int);
618 
620 
625  vtkGetMacro(GenerateMipmap, bool);
626  vtkSetMacro(GenerateMipmap, bool);
628 
630 
635  vtkSetMacro(MaximumAnisotropicFiltering, float);
636  vtkGetMacro(MaximumAnisotropicFiltering, float);
638 
640 
651 
659 
665  static bool IsSupported(vtkOpenGLRenderWindow*, bool /* requireTexFloat */,
666  bool /* requireDepthFloat */, bool /* requireTexInt */)
667  {
668  return true;
669  }
670 
674  static bool IsSupported(vtkOpenGLRenderWindow*) { return true; }
675 
677 
683  // part of a texture to part of a viewport, scaling as needed
684  void CopyToFrameBuffer(int srcXmin, int srcYmin, int srcXmax, int srcYmax, int dstXmin,
685  int dstYmin, int dstXmax, int dstYmax, int dstSizeX, int dstSizeY, vtkShaderProgram* program,
687  // copy part of a texure to part of a viewport, no scalaing
688  void CopyToFrameBuffer(int srcXmin, int srcYmin, int srcXmax, int srcYmax, int dstXmin,
689  int dstYmin, int dstSizeX, int dstSizeY, vtkShaderProgram* program,
691  // copy a texture to a quad using the provided tcoords and verts
693  float* tcoords, float* verts, vtkShaderProgram* program, vtkOpenGLVertexArrayObject* vao);
695 
708  int srcXmin, int srcYmin, int dstXmin, int dstYmin, int width, int height);
709 
722  void GetShiftAndScale(float& shift, float& scale);
723 
724  // resizes an existing texture, any existing
725  // data values are lost
726  void Resize(unsigned int width, unsigned int height);
727 
729 
735  vtkGetMacro(UseSRGBColorSpace, bool);
736  vtkSetMacro(UseSRGBColorSpace, bool);
737  vtkBooleanMacro(UseSRGBColorSpace, bool);
739 
748  void AssignToExistingTexture(unsigned int handle, unsigned int target);
749 
750 protected:
752  ~vtkTextureObject() override;
753 
755 
760 
765 
767  unsigned int Width;
768  unsigned int Height;
769  unsigned int Depth;
770  unsigned int Samples;
772 
774 
775  unsigned int Target; // GLenum
776  unsigned int Format; // GLenum
777  unsigned int InternalFormat; // GLenum
778  unsigned int Type; // GLenum
780 
782  unsigned int Handle;
783  bool OwnHandle;
790 
791  int WrapS;
792  int WrapT;
793  int WrapR;
796 
797  float MinLOD;
798  float MaxLOD;
800  int MaxLevel;
801  float BorderColor[4];
802 
805 
807 
810 
811  // used for copying to framebuffer
813 
814  // for texturebuffers we hold on to the Buffer
816 
817 private:
818  vtkTextureObject(const vtkTextureObject&) = delete;
819  void operator=(const vtkTextureObject&) = delete;
820 };
821 
822 #endif
a simple class to control print indentation
Definition: vtkIndent.h:113
abstract base class for most VTK objects
Definition: vtkObject.h:82
OpenGL buffer object.
OpenGL rendering window.
The VertexArrayObject class uses, or emulates, vertex array objects.
abstracts an OpenGL pixel buffer object.
The ShaderProgram uses one or more Shader objects.
abstracts an OpenGL texture object.
unsigned int Target
unsigned int InternalFormat
bool AllocateDepth(unsigned int width, unsigned int height, int internalFormat)
Create a 2D depth texture but does not initialize its values.
static bool IsSupported(vtkOpenGLRenderWindow *, bool, bool, bool)
Returns if the context supports the required extensions.
void SetContext(vtkOpenGLRenderWindow *)
Get/Set the context.
bool AllocateDepthStencil(unsigned int width, unsigned int height)
Create a 2D septh stencil texture but does not initialize its values.
float MaximumAnisotropicFiltering
bool Create2DFromRaw(unsigned int width, unsigned int height, int numComps, int dataType, void *data)
Create a 2D texture from client memory numComps must be in [1-4].
unsigned int Depth
vtkOpenGLHelper * ShaderProgram
bool IsBound()
Tells if the texture object is bound to the active texture image unit.
void SetInternalFormat(unsigned int glInternalFormat)
Get/Set internal format (OpenGL internal format) that should be used.
int GetDefaultDataType(int vtk_scalar_type)
Get the data type for the texture as GLenum type.
void Resize(unsigned int width, unsigned int height)
bool Allocate1D(unsigned int width, int numComps, int vtkType)
Create a 1D color texture but does not initialize its values.
virtual void Activate()
Activate and Bind the texture.
unsigned int GetWrapTMode(int vtktype)
bool Create1D(int numComps, vtkPixelBufferObject *pbo, bool shaderSupportsTextureInt)
Create a 1D texture using the PBO.
void CopyToFrameBuffer(vtkShaderProgram *program, vtkOpenGLVertexArrayObject *vao)
Copy the texture (src) in the current framebuffer.
void CopyToFrameBuffer(int srcXmin, int srcYmin, int srcXmax, int srcYmax, int dstXmin, int dstYmin, int dstXmax, int dstYmax, int dstSizeX, int dstSizeY, vtkShaderProgram *program, vtkOpenGLVertexArrayObject *vao)
Copy the texture (src) in the current framebuffer.
int GetVTKDataType()
Get the data type for the texture as a vtk type int i.e.
unsigned int Handle
void GetShiftAndScale(float &shift, float &scale)
Get the shift and scale required in the shader to return the texture values to their original range.
unsigned int GetFormat(int vtktype, int numComps, bool shaderSupportsTextureInt)
Get/Set format (OpenGL internal format) that should be used.
void DestroyTexture()
Destroy the texture.
void SetLinearMagnification(bool val)
Tells if the magnification mode is linear (true) or nearest (false).
bool AllocateProxyTexture3D(unsigned int const width, unsigned int const height, unsigned int const depth, int const numComps, int const dataType)
Create a 3D texture using the GL_PROXY_TEXTURE_3D target.
vtkTimeStamp SendParametersTime
unsigned int GetMinificationFilterMode(int vtktype)
int GetTextureUnit()
Return the texture unit used for this texture.
void ResetFormatAndType()
Reset format, internal format, and type of the texture.
bool CreateTextureBuffer(unsigned int numValues, int numComps, int dataType, vtkOpenGLBufferObject *bo)
Create a texture buffer basically a 1D texture that can be very large for passing data into the fragm...
static vtkTextureObject * New()
vtkGenericOpenGLResourceFreeCallback * ResourceCallback
void AssignToExistingTexture(unsigned int handle, unsigned int target)
Assign the TextureObject to a externally provided Handle and Target.
void CreateTexture()
Creates a texture handle if not already created.
static int GetMaximumTextureSize(vtkOpenGLRenderWindow *context)
Query and return maximum texture size (dimension) supported by the OpenGL driver for a particular con...
vtkOpenGLBufferObject * BufferObject
unsigned int GetWrapRMode(int vtktype)
bool Create3D(unsigned int width, unsigned int height, unsigned int depth, int numComps, int vtktype, bool)
Create texture without uploading any data.
unsigned int Format
bool CreateCubeFromRaw(unsigned int width, unsigned int height, int numComps, int dataType, void *data[6])
Create a cube texture from 6 buffers from client memory.
unsigned int GetWrapSMode(int vtktype)
void CopyToFrameBuffer(float *tcoords, float *verts, vtkShaderProgram *program, vtkOpenGLVertexArrayObject *vao)
Copy the texture (src) in the current framebuffer.
bool Create3D(unsigned int width, unsigned int height, unsigned int depth, int numComps, vtkPixelBufferObject *pbo, bool shaderSupportsTextureInt)
Create a 3D texture using the PBO.
bool Create2D(unsigned int width, unsigned int height, int numComps, int vtktype, bool)
Create texture without uploading any data.
virtual void ReleaseGraphicsResources(vtkWindow *win)
Deactivate and UnBind the texture.
void SetDataType(unsigned int glType)
Get the data type for the texture as GLenum type.
void Deactivate()
Deactivate and UnBind the texture.
vtkWeakPointer< vtkOpenGLRenderWindow > Context
bool CreateDepthFromRaw(unsigned int width, unsigned int height, int internalFormat, int rawType, void *raw)
Create a 2D depth texture using a raw pointer.
void SetFormat(unsigned int glFormat)
Get/Set format (OpenGL internal format) that should be used.
~vtkTextureObject() override
unsigned int GetInternalFormat(int vtktype, int numComps, bool shaderSupportsTextureInt)
Get/Set internal format (OpenGL internal format) that should be used.
static bool IsSupported(vtkOpenGLRenderWindow *)
Check for feature support, without any optional features.
unsigned int GetTuples()
Get the texture dimensions.
unsigned int Width
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
unsigned int GetMagnificationFilterMode(int vtktype)
bool Create3DFromRaw(unsigned int width, unsigned int height, unsigned int depth, int numComps, int dataType, void *data)
Create a 3D texture from client memory numComps must be in [1-4].
bool Create2D(unsigned int width, unsigned int height, int numComps, vtkPixelBufferObject *pbo, bool shaderSupportsTextureInt)
Create a 2D texture using the PBO.
int GetDataType(int vtk_scalar_type)
Get the data type for the texture as GLenum type.
bool Allocate3D(unsigned int width, unsigned int height, unsigned int depth, int numComps, int vtkType)
Create a 3D color texture but does not initialize its values.
unsigned int GetDefaultFormat(int vtktype, int numComps, bool shaderSupportsTextureInt)
Get/Set format (OpenGL internal format) that should be used.
static int GetMaximumTextureSize3D(vtkOpenGLRenderWindow *context)
Query and return maximum texture size (dimension) supported by the OpenGL driver for a particular con...
bool CreateDepth(unsigned int width, unsigned int height, int internalFormat, vtkPixelBufferObject *pbo)
Create a 2D depth texture using a PBO.
bool Allocate2D(unsigned int width, unsigned int height, int numComps, int vtkType, int level=0)
Create a 2D color texture but does not initialize its values.
vtkPixelBufferObject * Download(unsigned int target, unsigned int level)
unsigned int Height
void CopyFromFrameBuffer(int srcXmin, int srcYmin, int dstXmin, int dstYmin, int width, int height)
Copy a sub-part of a logical buffer of the framebuffer (color or depth) to the texture object.
vtkOpenGLRenderWindow * GetContext()
Get/Set the context.
unsigned int Samples
int GetMaximumTextureSize3D()
Overload which uses the internal context to query the maximum 3D texture size.
unsigned int GetDefaultInternalFormat(int vtktype, int numComps, bool shaderSupportsTextureInt)
Get/Set internal format (OpenGL internal format) that should be used.
void SendParameters()
Send all the texture object parameters to the hardware if not done yet.
void Bind()
Bind the texture, must have been created using Create().
bool Create1DFromRaw(unsigned int width, int numComps, int dataType, void *data)
Create 1D texture from client memory.
void CopyToFrameBuffer(int srcXmin, int srcYmin, int srcXmax, int srcYmax, int dstXmin, int dstYmin, int dstSizeX, int dstSizeY, vtkShaderProgram *program, vtkOpenGLVertexArrayObject *vao)
Copy the texture (src) in the current framebuffer.
vtkPixelBufferObject * Download()
This is used to download raw data from the texture into a pixel buffer.
record modification and/or execution time
Definition: vtkTimeStamp.h:52
window superclass for vtkRenderWindow
Definition: vtkWindow.h:39
@ level
Definition: vtkX3D.h:401
@ scale
Definition: vtkX3D.h:235
@ height
Definition: vtkX3D.h:260
@ data
Definition: vtkX3D.h:321
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)