VTK  9.0.1
vtkShaderProgram.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4 
5  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
6  All rights reserved.
7  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
8 
9  This software is distributed WITHOUT ANY WARRANTY; without even
10  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11  PURPOSE. See the above copyright notice for more information.
12 
13 =========================================================================*/
21 #ifndef vtkShaderProgram_h
22 #define vtkShaderProgram_h
23 
24 #include "vtkObject.h"
25 #include "vtkRenderingOpenGL2Module.h" // for export macro
26 
27 #include <map> // For member variables.
28 #include <string> // For member variables.
29 
30 class vtkMatrix3x3;
31 class vtkMatrix4x4;
33 class vtkShader;
34 class VertexArrayObject;
35 class vtkWindow;
36 
44 class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
45 {
46 public:
47  static vtkShaderProgram* New();
48  vtkTypeMacro(vtkShaderProgram, vtkObject);
49  void PrintSelf(ostream& os, vtkIndent indent) override;
50 
52 
55  vtkGetObjectMacro(VertexShader, vtkShader);
58 
60 
63  vtkGetObjectMacro(FragmentShader, vtkShader);
66 
68 
71  vtkGetObjectMacro(GeometryShader, vtkShader);
74 
76 
79  vtkGetObjectMacro(TransformFeedback, vtkTransformFeedback);
82 
84 
87  vtkGetMacro(Compiled, bool);
88  vtkSetMacro(Compiled, bool);
89  vtkBooleanMacro(Compiled, bool);
91 
95  std::string GetMD5Hash() const { return this->MD5Hash; }
96  void SetMD5Hash(const std::string& hash) { this->MD5Hash = hash; }
97 
100  {
111  NoNormalize
112  };
113 
118  bool isBound() const { return this->Bound; }
119 
124 
126  int GetHandle() const { return Handle; }
127 
129  std::string GetError() const { return Error; }
130 
135  bool EnableAttributeArray(const char* name);
136 
141  bool DisableAttributeArray(const char* name);
142 
158  bool UseAttributeArray(const char* name, int offset, size_t stride, int elementType,
159  int elementTupleSize, NormalizeOption normalize);
160 
178  template <class T>
180  const char* name, const T& array, int tupleSize, NormalizeOption normalize);
181 
183  bool SetUniformi(const char* name, int v);
184  bool SetUniformf(const char* name, float v);
185  bool SetUniform2i(const char* name, const int v[2]);
186  bool SetUniform2f(const char* name, const float v[2]);
187  bool SetUniform3f(const char* name, const float v[3]);
188  bool SetUniform3f(const char* name, const double v[3]);
189  bool SetUniform4f(const char* name, const float v[4]);
190  bool SetUniform3uc(const char* name, const unsigned char v[3]); // maybe remove
191  bool SetUniform4uc(const char* name, const unsigned char v[4]); // maybe remove
192  bool SetUniformMatrix(const char* name, vtkMatrix3x3* v);
193  bool SetUniformMatrix(const char* name, vtkMatrix4x4* v);
194  bool SetUniformMatrix3x3(const char* name, float* v);
195  bool SetUniformMatrix4x4(const char* name, float* v);
196 
198  bool SetUniform1iv(const char* name, const int count, const int* f);
199  bool SetUniform1fv(const char* name, const int count, const float* f);
200  bool SetUniform2fv(const char* name, const int count, const float* f);
201  bool SetUniform2fv(const char* name, const int count, const float (*f)[2]);
202  bool SetUniform3fv(const char* name, const int count, const float* f);
203  bool SetUniform3fv(const char* name, const int count, const float (*f)[3]);
204  bool SetUniform4fv(const char* name, const int count, const float* f);
205  bool SetUniform4fv(const char* name, const int count, const float (*f)[4]);
206  bool SetUniformMatrix4x4v(const char* name, const int count, float* v);
207 
208  // How many outputs does this program produce
209  // only valid for OpenGL 3.2 or later
210  vtkSetMacro(NumberOfOutputs, unsigned int);
211 
223  static bool Substitute(
224  std::string& source, const std::string& search, const std::string& replace, bool all = true);
225 
237  static bool Substitute(
238  vtkShader* shader, const std::string& search, const std::string& replace, bool all = true);
239 
245  bool IsUniformUsed(const char*);
246 
251  bool IsAttributeUsed(const char* name);
252 
253  // maps of std::string are super slow when calling find
254  // with a string literal or const char * as find
255  // forces construction/copy/destruction of a
256  // std::string copy of the const char *
257  // In spite of the doubters this can really be a
258  // huge CPU hog.
259  struct cmp_str
260  {
261  bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; }
262  };
263 
265 
282  vtkSetStringMacro(FileNamePrefixForDebugging);
283  vtkGetStringMacro(FileNamePrefixForDebugging);
285 
287 
293  {
296  UserGroup, // always will be last
297  };
301 
302  // returns the location for a uniform or attribute in
303  // this program. Is cached for performance.
304  int FindUniform(const char* name);
305  int FindAttributeArray(const char* name);
306 
307 protected:
309  ~vtkShaderProgram() override;
310 
311  /***************************************************************
312  * The following functions are only for use by the shader cache
313  * which is why they are protected and that class is a friend
314  * you need to use the shader cache to compile/link/bind your shader
315  * do not try to do it yourself as it will screw up the cache
316  ***************************************************************/
317  friend class vtkOpenGLShaderCache;
318 
325  bool AttachShader(const vtkShader* shader);
326 
332  bool DetachShader(const vtkShader* shader);
333 
337  virtual int CompileShader();
338 
344  bool Link();
345 
350  bool Bind();
351 
353  void Release();
354 
355  /************* end **************************************/
356 
361 
362  // hash of the shader program
364 
366  const char* name, void* buffer, int type, int tupleSize, NormalizeOption normalize);
367  int Handle;
371 
372  bool Linked;
373  bool Bound;
374  bool Compiled;
375 
376  // for glsl 1.5 or later, how many outputs
377  // does this shader create
378  // they will be bound in order to
379  // fragOutput0 fragOutput1 etc...
380  unsigned int NumberOfOutputs;
381 
383 
384  // since we are using const char * arrays we have to
385  // free our memory :-)
386  void ClearMaps();
387  std::map<const char*, int, cmp_str> AttributeLocs;
388  std::map<const char*, int, cmp_str> UniformLocs;
389 
390  std::map<int, vtkMTimeType> UniformGroupMTimes;
391 
392  friend class VertexArrayObject;
393 
394 private:
395  vtkShaderProgram(const vtkShaderProgram&) = delete;
396  void operator=(const vtkShaderProgram&) = delete;
397 
398  char* FileNamePrefixForDebugging;
399 };
400 
401 #endif
a simple class to control print indentation
Definition: vtkIndent.h:34
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:34
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:36
abstract base class for most VTK objects
Definition: vtkObject.h:63
manage Shader Programs within a context
The ShaderProgram uses one or more Shader objects.
bool Link()
Attempt to link the shader program.
bool SetUniform4fv(const char *name, const int count, const float *f)
void Release()
Releases the shader program from the current context.
bool SetUniform4fv(const char *name, const int count, const float(*f)[4])
vtkShader * FragmentShader
~vtkShaderProgram() override
void SetFragmentShader(vtkShader *)
std::string GetError() const
Get the error message (empty if none) for the shader program.
bool SetUniform2fv(const char *name, const int count, const float *f)
bool IsUniformUsed(const char *)
methods to inquire as to what uniforms/attributes are used by this shader.
bool Bind()
Bind the program in order to use it.
bool SetAttributeArray(const char *name, const T &array, int tupleSize, NormalizeOption normalize)
Upload the supplied array of tightly packed values to the named attribute.
void SetVertexShader(vtkShader *)
bool SetUniform2i(const char *name, const int v[2])
vtkTransformFeedback * TransformFeedback
bool SetUniform3f(const char *name, const float v[3])
int FindAttributeArray(const char *name)
static vtkShaderProgram * New()
std::string GetMD5Hash() const
Set/Get the md5 hash of this program.
bool SetUniform4uc(const char *name, const unsigned char v[4])
std::map< const char *, int, cmp_str > UniformLocs
bool SetUniform4f(const char *name, const float v[4])
bool SetUniform2f(const char *name, const float v[2])
bool SetUniformMatrix4x4v(const char *name, const int count, float *v)
bool SetUniformMatrix(const char *name, vtkMatrix4x4 *v)
UniformGroups
Set/Get times that can be used to track when a set of uniforms was last updated.
bool SetUniform1iv(const char *name, const int count, const int *f)
Set the name uniform array to f with count elements.
bool AttachShader(const vtkShader *shader)
Attach the supplied shader to this program.
int FindUniform(const char *name)
bool SetAttributeArrayInternal(const char *name, void *buffer, int type, int tupleSize, NormalizeOption normalize)
int GetHandle() const
Get the handle of the shader program.
NormalizeOption
Options for attribute normalization.
@ Normalize
The values range across the limits of the numeric type.
bool SetUniform3f(const char *name, const double v[3])
void SetMD5Hash(const std::string &hash)
bool EnableAttributeArray(const char *name)
Enable the named attribute array.
vtkShader * VertexShader
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
bool isBound() const
Check if the program is currently bound, or not.
void SetUniformGroupUpdateTime(int, vtkMTimeType tm)
bool SetUniformMatrix(const char *name, vtkMatrix3x3 *v)
std::map< const char *, int, cmp_str > AttributeLocs
bool DetachShader(const vtkShader *shader)
Detach the supplied shader from this program.
bool SetUniform3fv(const char *name, const int count, const float *f)
bool SetUniformf(const char *name, float v)
bool SetUniformMatrix4x4(const char *name, float *v)
bool SetUniform2fv(const char *name, const int count, const float(*f)[2])
vtkShader * GeometryShader
bool SetUniformMatrix3x3(const char *name, float *v)
bool DisableAttributeArray(const char *name)
Disable the named attribute array.
bool SetUniform3uc(const char *name, const unsigned char v[3])
bool IsAttributeUsed(const char *name)
Return true if the compiled and linked shader has an attribute matching name.
bool UseAttributeArray(const char *name, int offset, size_t stride, int elementType, int elementTupleSize, NormalizeOption normalize)
Use the named attribute array with the bound BufferObject.
bool SetUniformi(const char *name, int v)
Set the name uniform value to int v.
unsigned int NumberOfOutputs
bool SetUniform1fv(const char *name, const int count, const float *f)
vtkMTimeType GetUniformGroupUpdateTime(int)
void SetGeometryShader(vtkShader *)
std::map< int, vtkMTimeType > UniformGroupMTimes
bool SetUniform3fv(const char *name, const int count, const float(*f)[3])
void ReleaseGraphicsResources(vtkWindow *win)
release any graphics resources this class is using.
static bool Substitute(std::string &source, const std::string &search, const std::string &replace, bool all=true)
perform in place string substitutions, indicate if a substitution was done this is useful for buildin...
virtual int CompileShader()
Compile this shader program and attached shaders.
void SetTransformFeedback(vtkTransformFeedback *tfc)
static bool Substitute(vtkShader *shader, const std::string &search, const std::string &replace, bool all=true)
Perform in-place string substitutions on the shader source string and indicate if one or all substitu...
Vertex or Fragment shader, combined into a ShaderProgram.
Definition: vtkShader.h:38
Manages a TransformFeedback buffer.
window superclass for vtkRenderWindow
Definition: vtkWindow.h:38
@ type
Definition: vtkX3D.h:522
@ name
Definition: vtkX3D.h:225
@ offset
Definition: vtkX3D.h:444
@ string
Definition: vtkX3D.h:496
bool operator()(const char *a, const char *b) const
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
vtkTypeUInt32 vtkMTimeType
Definition: vtkType.h:293