VTK
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 =========================================================================*/
24 #ifndef vtkShaderProgram_h
25 #define vtkShaderProgram_h
26 
27 #include "vtkRenderingOpenGL2Module.h" // for export macro
28 #include "vtkObject.h"
29 
30 #include <string> // For member variables.
31 #include <map> // For member variables.
32 
33 class vtkMatrix3x3;
34 class vtkMatrix4x4;
36 class vtkShader;
37 class VertexArrayObject;
38 class vtkWindow;
39 
47 class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
48 {
49 public:
50  static vtkShaderProgram *New();
51  vtkTypeMacro(vtkShaderProgram, vtkObject);
52  void PrintSelf(ostream& os, vtkIndent indent) override;
53 
55 
58  vtkGetObjectMacro(VertexShader, vtkShader);
59  void SetVertexShader(vtkShader*);
61 
63 
66  vtkGetObjectMacro(FragmentShader, vtkShader);
67  void SetFragmentShader(vtkShader*);
69 
71 
74  vtkGetObjectMacro(GeometryShader, vtkShader);
75  void SetGeometryShader(vtkShader*);
77 
79 
82  vtkGetObjectMacro(TransformFeedback, vtkTransformFeedback);
83  void SetTransformFeedback(vtkTransformFeedback *tfc);
85 
87 
90  vtkGetMacro(Compiled, bool);
91  vtkSetMacro(Compiled, bool);
92  vtkBooleanMacro(Compiled, bool);
94 
98  std::string GetMD5Hash() const { return this->MD5Hash; }
99  void SetMD5Hash(const std::string &hash) { this->MD5Hash = hash; }
100 
101 
114  NoNormalize
115  };
116 
117 
122  bool isBound() const { return this->Bound; }
123 
127  void ReleaseGraphicsResources(vtkWindow *win);
128 
130  int GetHandle() const { return Handle; }
131 
133  std::string GetError() const { return Error; }
134 
139  bool EnableAttributeArray(const char *name);
140 
145  bool DisableAttributeArray(const char *name);
146 
162  bool UseAttributeArray(const char *name, int offset, size_t stride,
163  int elementType, int elementTupleSize,
164  NormalizeOption normalize);
165 
183  template <class T>
184  bool SetAttributeArray(const char *name, const T &array,
185  int tupleSize, NormalizeOption normalize);
186 
188  bool SetUniformi(const char *name, int v);
189  bool SetUniformf(const char *name, float v);
190  bool SetUniform2i(const char *name, const int v[2]);
191  bool SetUniform2f(const char *name, const float v[2]);
192  bool SetUniform3f(const char *name, const float v[3]);
193  bool SetUniform3f(const char *name, const double v[3]);
194  bool SetUniform4f(const char *name, const float v[4]);
195  bool SetUniform3uc(const char *name, const unsigned char v[3]); // maybe remove
196  bool SetUniform4uc(const char *name, const unsigned char v[4]); // maybe remove
197  bool SetUniformMatrix(const char *name, vtkMatrix3x3 *v);
198  bool SetUniformMatrix(const char *name, vtkMatrix4x4 *v);
199  bool SetUniformMatrix3x3(const char *name, float *v);
200  bool SetUniformMatrix4x4(const char *name, float *v);
201 
203  bool SetUniform1iv(const char *name, const int count, const int *f);
204  bool SetUniform1fv(const char *name, const int count, const float *f);
205  bool SetUniform2fv(const char *name, const int count, const float (*f)[2]);
206  bool SetUniform3fv(const char *name, const int count, const float (*f)[3]);
207  bool SetUniform4fv(const char *name, const int count, const float (*f)[4]);
208  bool SetUniformMatrix4x4v(const char *name, const int count, float *v);
209 
210  // How many outputs does this program produce
211  // only valid for OpenGL 3.2 or later
212  vtkSetMacro(NumberOfOutputs,unsigned int);
213 
225  static bool Substitute(
227  const std::string &search,
228  const std::string &replace,
229  bool all = true);
230 
242  static bool Substitute(
243  vtkShader* shader,
244  const std::string &search,
245  const std::string &replace,
246  bool all = true);
247 
253  bool IsUniformUsed(const char *);
254 
259  bool IsAttributeUsed(const char *name);
260 
261  // maps of std::string are super slow when calling find
262  // with a string literal or const char * as find
263  // forces construction/copy/destruction of a
264  // std::sting copy of the const char *
265  // In spite of the doubters this can really be a
266  // huge CPU hog.
267  struct cmp_str
268  {
269  bool operator()(const char *a, const char *b) const
270  {
271  return strcmp(a, b) < 0;
272  }
273  };
274 
276 
293  vtkSetStringMacro(FileNamePrefixForDebugging);
294  vtkGetStringMacro(FileNamePrefixForDebugging);
296 
297 protected:
299  ~vtkShaderProgram() override;
300 
301  /***************************************************************
302  * The following functions are only for use by the shader cache
303  * which is why they are protected and that class is a friend
304  * you need to use the shader cache to compile/link/bind your shader
305  * do not try to do it yourself as it will screw up the cache
306  ***************************************************************/
307  friend class vtkOpenGLShaderCache;
308 
315  bool AttachShader(const vtkShader *shader);
316 
322  bool DetachShader(const vtkShader *shader);
323 
327  virtual int CompileShader();
328 
334  bool Link();
335 
340  bool Bind();
341 
343  void Release();
344 
345  /************* end **************************************/
346 
351 
352  // hash of the shader program
354 
355  bool SetAttributeArrayInternal(const char *name, void *buffer,
356  int type, int tupleSize,
357  NormalizeOption normalize);
358  int Handle;
362 
363  bool Linked;
364  bool Bound;
365  bool Compiled;
366 
367  // for glsl 1.5 or later, how many outputs
368  // does this shader create
369  // they will be bound in order to
370  // fragOutput0 fragOutput1 etc...
371  unsigned int NumberOfOutputs;
372 
374 
375  // since we are using const char * arrays we have to
376  // free our memory :-)
377  void ClearMaps();
378  std::map<const char *, int, cmp_str> AttributeLocs;
379  std::map<const char *, int, cmp_str> UniformLocs;
380 
381  friend class VertexArrayObject;
382 
383 private:
384  int FindAttributeArray(const char *name);
385  int FindUniform(const char *name);
386 
387  vtkShaderProgram(const vtkShaderProgram&) = delete;
388  void operator=(const vtkShaderProgram&) = delete;
389 
390  char* FileNamePrefixForDebugging;
391 };
392 
393 
394 #endif
abstract base class for most VTK objects
Definition: vtkObject.h:59
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:41
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
vtkTransformFeedback * TransformFeedback
bool isBound() const
Check if the program is currently bound, or not.
unsigned int NumberOfOutputs
manage Shader Programs within a context
vtkShader * VertexShader
The values range across the limits of the numeric type.
std::map< const char *, int, cmp_str > UniformLocs
int GetHandle() const
Get the handle of the shader program.
void SetMD5Hash(const std::string &hash)
window superclass for vtkRenderWindow
Definition: vtkWindow.h:37
a simple class to control print indentation
Definition: vtkIndent.h:39
vtkShader * GeometryShader
bool operator()(const char *a, const char *b) const
Manages a TransformFeedback buffer.
std::string GetMD5Hash() const
Set/Get the md5 hash of this program.
vtkShader * FragmentShader
vtkGetStringMacro(ExtensionsString)
Returns a string listing all available extensions.
std::string GetError() const
Get the error message (empty if none) for the shader program.
vtkSetMacro(IgnoreDriverBugs, bool)
When set known driver bugs are ignored during driver feature detection.
NormalizeOption
Options for attribute normalization.
boost::graph_traits< vtkGraph *>::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
Vertex or Fragment shader, combined into a ShaderProgram.
Definition: vtkShader.h:40
std::map< const char *, int, cmp_str > AttributeLocs
vtkBooleanMacro(IgnoreDriverBugs, bool)
When set known driver bugs are ignored during driver feature detection.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:36
The ShaderProgram uses one or more Shader objects.