VTK  9.1.0
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=========================================================================*/
30#ifndef vtkShaderProgram_h
31#define vtkShaderProgram_h
32
33#include "vtkObject.h"
34#include "vtkRenderingOpenGL2Module.h" // for export macro
35
36#include <map> // For member variables.
37#include <string> // For member variables.
38
39class vtkMatrix3x3;
40class vtkMatrix4x4;
42class vtkShader;
43class VertexArrayObject;
44class vtkWindow;
45
53class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
54{
55public:
58 void PrintSelf(ostream& os, vtkIndent indent) override;
59
61
64 vtkGetObjectMacro(VertexShader, vtkShader);
67
69
72 vtkGetObjectMacro(FragmentShader, vtkShader);
75
77
80 vtkGetObjectMacro(GeometryShader, vtkShader);
83
85
88 vtkGetObjectMacro(TransformFeedback, vtkTransformFeedback);
91
93
96 vtkGetMacro(Compiled, bool);
97 vtkSetMacro(Compiled, bool);
98 vtkBooleanMacro(Compiled, bool);
100
104 std::string GetMD5Hash() const { return this->MD5Hash; }
105 void SetMD5Hash(const std::string& hash) { this->MD5Hash = hash; }
106
109 {
120 NoNormalize
121 };
122
127 bool isBound() const { return this->Bound; }
128
133
135 int GetHandle() const { return Handle; }
136
138 std::string GetError() const { return Error; }
139
144 bool EnableAttributeArray(const char* name);
145
150 bool DisableAttributeArray(const char* name);
151
167 bool UseAttributeArray(const char* name, int offset, size_t stride, int elementType,
168 int elementTupleSize, NormalizeOption normalize);
169
187 template <class T>
189 const char* name, const T& array, int tupleSize, NormalizeOption normalize);
190
192 bool SetUniformi(const char* name, int v);
193 bool SetUniformf(const char* name, float v);
194 bool SetUniform2i(const char* name, const int v[2]);
195 bool SetUniform2f(const char* name, const float v[2]);
196 bool SetUniform3f(const char* name, const float v[3]);
197 bool SetUniform3f(const char* name, const double v[3]);
198 bool SetUniform4f(const char* name, const float v[4]);
199 bool SetUniform3uc(const char* name, const unsigned char v[3]); // maybe remove
200 bool SetUniform4uc(const char* name, const unsigned char v[4]); // maybe remove
201 bool SetUniformMatrix(const char* name, vtkMatrix3x3* v);
202 bool SetUniformMatrix(const char* name, vtkMatrix4x4* v);
203 bool SetUniformMatrix3x3(const char* name, float* v);
204 bool SetUniformMatrix4x4(const char* name, float* v);
205
207 bool SetUniform1iv(const char* name, const int count, const int* f);
208 bool SetUniform1fv(const char* name, const int count, const float* f);
209 bool SetUniform2fv(const char* name, const int count, const float* f);
210 bool SetUniform2fv(const char* name, const int count, const float (*f)[2]);
211 bool SetUniform3fv(const char* name, const int count, const float* f);
212 bool SetUniform3fv(const char* name, const int count, const float (*f)[3]);
213 bool SetUniform4fv(const char* name, const int count, const float* f);
214 bool SetUniform4fv(const char* name, const int count, const float (*f)[4]);
215 bool SetUniformMatrix4x4v(const char* name, const int count, float* v);
216
217 // How many outputs does this program produce
218 // only valid for OpenGL 3.2 or later
219 vtkSetMacro(NumberOfOutputs, unsigned int);
220
232 static bool Substitute(
233 std::string& source, const std::string& search, const std::string& replace, bool all = true);
234
246 static bool Substitute(
247 vtkShader* shader, const std::string& search, const std::string& replace, bool all = true);
248
254 bool IsUniformUsed(const char*);
255
260 bool IsAttributeUsed(const char* name);
261
262 // maps of std::string are super slow when calling find
263 // with a string literal or const char * as find
264 // forces construction/copy/destruction of a
265 // std::string copy of the const char *
266 // In spite of the doubters this can really be a
267 // huge CPU hog.
268 struct cmp_str
269 {
270 bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; }
271 };
272
274
291 vtkSetFilePathMacro(FileNamePrefixForDebugging);
292 vtkGetFilePathMacro(FileNamePrefixForDebugging);
294
296
302 {
305 UserGroup, // always will be last
306 };
310
311 // returns the location for a uniform or attribute in
312 // this program. Is cached for performance.
313 int FindUniform(const char* name);
314 int FindAttributeArray(const char* name);
315
316protected:
319
320 /***************************************************************
321 * The following functions are only for use by the shader cache
322 * which is why they are protected and that class is a friend
323 * you need to use the shader cache to compile/link/bind your shader
324 * do not try to do it yourself as it will screw up the cache
325 ***************************************************************/
327
334 bool AttachShader(const vtkShader* shader);
335
341 bool DetachShader(const vtkShader* shader);
342
346 virtual int CompileShader();
347
353 bool Link();
354
359 bool Bind();
360
362 void Release();
363
364 /************* end **************************************/
365
370
371 // hash of the shader program
373
375 const char* name, void* buffer, int type, int tupleSize, NormalizeOption normalize);
380
381 bool Linked;
382 bool Bound;
384
385 // for glsl 1.5 or later, how many outputs
386 // does this shader create
387 // they will be bound in order to
388 // fragOutput0 fragOutput1 etc...
389 unsigned int NumberOfOutputs;
390
392
393 // since we are using const char * arrays we have to
394 // free our memory :-)
395 void ClearMaps();
396 std::map<const char*, int, cmp_str> AttributeLocs;
397 std::map<const char*, int, cmp_str> UniformLocs;
398
399 std::map<int, vtkMTimeType> UniformGroupMTimes;
400
401 friend class VertexArrayObject;
402
403private:
404 vtkShaderProgram(const vtkShaderProgram&) = delete;
405 void operator=(const vtkShaderProgram&) = delete;
406
407 char* FileNamePrefixForDebugging;
408};
409
410#endif
a simple class to control print indentation
Definition: vtkIndent.h:43
represent and manipulate 3x3 transformation matrices
Definition: vtkMatrix3x3.h:43
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:45
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 *)
Get the fragment shader for this program.
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.
vtkSetFilePathMacro(FileNamePrefixForDebugging)
When developing shaders, it's often convenient to tweak the shader and re-render incrementally.
void SetVertexShader(vtkShader *)
Get 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)
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)
static vtkShaderProgram * New()
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)
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 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)
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 the geometry shader for this program.
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)
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...
Vertex or Fragment shader, combined into a ShaderProgram.
Definition: vtkShader.h:47
Manages a TransformFeedback buffer.
window superclass for vtkRenderWindow
Definition: vtkWindow.h:45
@ 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:287