VTK  9.3.20240419
vtkShaderProgram.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
74 #ifndef vtkShaderProgram_h
75 #define vtkShaderProgram_h
76 
77 #include "vtkObject.h"
78 #include "vtkRenderingOpenGL2Module.h" // for export macro
79 
80 #include <map> // For member variables.
81 #include <string> // For member variables.
82 
83 VTK_ABI_NAMESPACE_BEGIN
84 class vtkMatrix3x3;
85 class vtkMatrix4x4;
87 class vtkShader;
88 class VertexArrayObject;
89 class vtkWindow;
90 
100 class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
101 {
102 public:
104  vtkTypeMacro(vtkShaderProgram, vtkObject);
105  void PrintSelf(ostream& os, vtkIndent indent) override;
106 
108 
111  vtkGetObjectMacro(VertexShader, vtkShader);
114 
116 
119  vtkGetObjectMacro(FragmentShader, vtkShader);
122 
124 
127  vtkGetObjectMacro(GeometryShader, vtkShader);
130 
132 
135  vtkGetObjectMacro(ComputeShader, vtkShader);
138 
140 
143  vtkGetObjectMacro(TessControlShader, vtkShader);
146 
148 
151  vtkGetObjectMacro(TessEvaluationShader, vtkShader);
154 
156 
159  vtkGetObjectMacro(TransformFeedback, vtkTransformFeedback);
162 
164 
167  vtkGetMacro(Compiled, bool);
168  vtkSetMacro(Compiled, bool);
169  vtkBooleanMacro(Compiled, bool);
171 
175  std::string GetMD5Hash() const { return this->MD5Hash; }
176  void SetMD5Hash(const std::string& hash) { this->MD5Hash = hash; }
177 
180  {
191  NoNormalize
192  };
193 
198  bool isBound() const { return this->Bound; }
199 
204 
206  int GetHandle() const { return Handle; }
207 
209  std::string GetError() const { return Error; }
210 
215  bool EnableAttributeArray(const char* name);
216 
221  bool DisableAttributeArray(const char* name);
222 
238  bool UseAttributeArray(const char* name, int offset, size_t stride, int elementType,
239  int elementTupleSize, NormalizeOption normalize);
240 
258  template <class T>
260  const char* name, const T& array, int tupleSize, NormalizeOption normalize);
261 
263  bool SetUniformi(const char* name, int v);
264  bool SetUniformf(const char* name, float v);
265  bool SetUniform2i(const char* name, const int v[2]);
266  bool SetUniform2f(const char* name, const float v[2]);
267  bool SetUniform3f(const char* name, const float v[3]);
268  bool SetUniform3f(const char* name, const double v[3]);
269  bool SetUniform4f(const char* name, const float v[4]);
270  bool SetUniform3uc(const char* name, const unsigned char v[3]); // maybe remove
271  bool SetUniform4uc(const char* name, const unsigned char v[4]); // maybe remove
272  bool SetUniformMatrix(const char* name, vtkMatrix3x3* v);
273  bool SetUniformMatrix(const char* name, vtkMatrix4x4* v);
274  bool SetUniformMatrix3x3(const char* name, float* v);
275  bool SetUniformMatrix4x4(const char* name, float* v);
276 
278  bool SetUniform1iv(const char* name, int count, const int* f);
279  bool SetUniform1fv(const char* name, int count, const float* f);
280  bool SetUniform2fv(const char* name, int count, const float* f);
281  bool SetUniform2fv(const char* name, int count, const float (*f)[2]);
282  bool SetUniform3fv(const char* name, int count, const float* f);
283  bool SetUniform3fv(const char* name, int count, const float (*f)[3]);
284  bool SetUniform4fv(const char* name, int count, const float* f);
285  bool SetUniform4fv(const char* name, int count, const float (*f)[4]);
286  bool SetUniformMatrix4x4v(const char* name, int count, float* v);
287 
288  // How many outputs does this program produce
289  // only valid for OpenGL 3.2 or later
290  vtkSetMacro(NumberOfOutputs, unsigned int);
291 
303  static bool Substitute(
304  std::string& source, const std::string& search, const std::string& replace, bool all = true);
305 
317  static bool Substitute(
318  vtkShader* shader, const std::string& search, const std::string& replace, bool all = true);
319 
325  bool IsUniformUsed(const char*);
326 
331  bool IsAttributeUsed(const char* name);
332 
333  // maps of std::string are super slow when calling find
334  // with a string literal or const char * as find
335  // forces construction/copy/destruction of a
336  // std::string copy of the const char *
337  // In spite of the doubters this can really be a
338  // huge CPU hog.
339  struct cmp_str
340  {
341  bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; }
342  };
343 
345 
362  vtkSetFilePathMacro(FileNamePrefixForDebugging);
363  vtkGetFilePathMacro(FileNamePrefixForDebugging);
365 
367 
373  {
376  UserGroup, // always will be last
377  };
381 
382  // returns the location for a uniform or attribute in
383  // this program. Is cached for performance.
384  int FindUniform(const char* name);
385  int FindAttributeArray(const char* name);
386 
387 protected:
389  ~vtkShaderProgram() override;
390 
391  /***************************************************************
392  * The following functions are only for use by the shader cache
393  * which is why they are protected and that class is a friend
394  * you need to use the shader cache to compile/link/bind your shader
395  * do not try to do it yourself as it will screw up the cache
396  ***************************************************************/
397  friend class vtkOpenGLShaderCache;
398 
405  bool AttachShader(const vtkShader* shader);
406 
412  bool DetachShader(const vtkShader* shader);
413 
417  virtual int CompileShader();
418 
424  bool Link();
425 
430  bool Bind();
431 
433  void Release();
434 
435  /************* end **************************************/
436 
444 
445  // hash of the shader program
447 
449  const char* name, void* buffer, int type, int tupleSize, NormalizeOption normalize);
450  int Handle;
457 
458  bool Linked;
459  bool Bound;
460  bool Compiled;
461 
462  // for glsl 1.5 or later, how many outputs
463  // does this shader create
464  // they will be bound in order to
465  // fragOutput0 fragOutput1 etc...
466  unsigned int NumberOfOutputs;
467 
469 
470  // since we are using const char * arrays we have to
471  // free our memory :-)
472  void ClearMaps();
473  std::map<const char*, int, cmp_str> AttributeLocs;
474  std::map<const char*, int, cmp_str> UniformLocs;
475 
476  std::map<int, vtkMTimeType> UniformGroupMTimes;
477 
478  friend class VertexArrayObject;
479 
480 private:
481  vtkShaderProgram(const vtkShaderProgram&) = delete;
482  void operator=(const vtkShaderProgram&) = delete;
483 
484  // print shader code and report error
485  void ReportShaderError(vtkShader* shader);
486 
487  char* FileNamePrefixForDebugging;
488 };
489 
490 VTK_ABI_NAMESPACE_END
491 #endif
a simple class to control print indentation
Definition: vtkIndent.h:108
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:56
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:141
abstract base class for most VTK objects
Definition: vtkObject.h:162
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, int count, const float *f)
void Release()
Releases the shader program from the current context.
void SetTessControlShader(vtkShader *)
Get/set the tess control shader for this program.
vtkShader * FragmentShader
~vtkShaderProgram() override
void SetFragmentShader(vtkShader *)
Get/set the fragment shader for this program.
std::string GetError() const
Get the error message (empty if none) for the shader program.
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.
vtkSetFilePathMacro(FileNamePrefixForDebugging)
When developing shaders, it's often convenient to tweak the shader and re-render incrementally.
void SetVertexShader(vtkShader *)
Get/set the vertex shader for this program.
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 SetUniform3fv(const char *name, int count, const float *f)
bool SetUniform2f(const char *name, const float v[2])
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 AttachShader(const vtkShader *shader)
Attach the supplied shader to this program.
bool SetUniform3fv(const char *name, int count, const float(*f)[3])
bool SetUniform4fv(const char *name, int count, const float(*f)[4])
int FindUniform(const char *name)
bool SetAttributeArrayInternal(const char *name, void *buffer, int type, int tupleSize, NormalizeOption normalize)
bool SetUniform2fv(const char *name, int count, const float(*f)[2])
int GetHandle() const
Get the handle of the shader program.
bool SetUniform1fv(const char *name, int count, const float *f)
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])
vtkShader * TessControlShader
void SetMD5Hash(const std::string &hash)
bool EnableAttributeArray(const char *name)
Enable the named attribute array.
vtkShader * VertexShader
vtkShader * ComputeShader
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)
Set/Get times that can be used to track when a set of uniforms was last updated.
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 SetUniform2fv(const char *name, int count, const float *f)
bool SetUniformf(const char *name, float v)
bool SetUniformMatrix4x4(const char *name, float *v)
vtkShader * GeometryShader
bool SetUniformMatrix3x3(const char *name, float *v)
bool DisableAttributeArray(const char *name)
Disable the named attribute array.
bool SetUniform1iv(const char *name, int count, const int *f)
Set the name uniform array to f with count elements.
vtkShader * TessEvaluationShader
bool SetUniform3uc(const char *name, const unsigned char v[3])
void SetTessEvaluationShader(vtkShader *)
Get/set the tess evaluation shader for this program.
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 SetUniformMatrix4x4v(const char *name, int count, float *v)
vtkMTimeType GetUniformGroupUpdateTime(int)
Set/Get times that can be used to track when a set of uniforms was last updated.
vtkGetFilePathMacro(FileNamePrefixForDebugging)
When developing shaders, it's often convenient to tweak the shader and re-render incrementally.
void SetGeometryShader(vtkShader *)
Get/set the geometry shader for this program.
std::map< int, vtkMTimeType > UniformGroupMTimes
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)
Get/Set a TransformFeedbackCapture object on this shader program.
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...
void SetComputeShader(vtkShader *)
Get/set the compute shader for this program.
Vertex or Fragment shader, combined into a ShaderProgram.
Definition: vtkShader.h:120
Manages a TransformFeedback buffer.
window superclass for vtkRenderWindow
Definition: vtkWindow.h:48
@ type
Definition: vtkX3D.h:516
@ name
Definition: vtkX3D.h:219
@ offset
Definition: vtkX3D.h:438
@ string
Definition: vtkX3D.h:490
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:270