VTK  9.7.20260724
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
73
74#ifndef vtkShaderProgram_h
75#define vtkShaderProgram_h
76
77#include "vtkObject.h"
78#include "vtkRenderingOpenGL2Module.h" // for export macro
79
80#include <cstddef> // For std::size_t.
81#include <map> // For member variables.
82#include <string> // For member variables.
83#include <vector> // For member variables.
84
85VTK_ABI_NAMESPACE_BEGIN
86class vtkMatrix3x3;
87class vtkMatrix4x4;
89class vtkShader;
90class VertexArrayObject;
91class vtkWindow;
92
101
102class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
103{
104public:
107 void PrintSelf(ostream& os, vtkIndent indent) override;
108
110
113 vtkGetObjectMacro(VertexShader, vtkShader);
116
118
121 vtkGetObjectMacro(FragmentShader, vtkShader);
124
126
129 vtkGetObjectMacro(GeometryShader, vtkShader);
132
134
137 vtkGetObjectMacro(ComputeShader, vtkShader);
140
142
145 vtkGetObjectMacro(TessControlShader, vtkShader);
148
150
153 vtkGetObjectMacro(TessEvaluationShader, vtkShader);
156
158
164
166
169 vtkGetMacro(Compiled, bool);
170 vtkSetMacro(Compiled, bool);
171 vtkBooleanMacro(Compiled, bool);
173
177 std::string GetHash() const { return this->MD5Hash; }
178 void SetHash(const std::string& hash) { this->MD5Hash = hash; }
179
195
200 bool isBound() const { return this->Bound; }
201
206
208 int GetHandle() const { return Handle; }
209
211 std::string GetError() const { return Error; }
212
217 bool EnableAttributeArray(const char* name);
218
223 bool DisableAttributeArray(const char* name);
224
240 bool UseAttributeArray(const char* name, int offset, size_t stride, int elementType,
241 int elementTupleSize, NormalizeOption normalize);
242
260 template <class T>
262 const char* name, const T& array, int tupleSize, NormalizeOption normalize);
263
265 bool SetUniformi(const char* name, int v);
266 bool SetUniformf(const char* name, float v);
267 bool SetUniform2i(const char* name, const int v[2]);
268 bool SetUniform2f(const char* name, const float v[2]);
269 bool SetUniform3f(const char* name, const float v[3]);
270 bool SetUniform3f(const char* name, const double v[3]);
271 bool SetUniform4f(const char* name, const float v[4]);
272 bool SetUniform3uc(const char* name, const unsigned char v[3]); // maybe remove
273 bool SetUniform4uc(const char* name, const unsigned char v[4]); // maybe remove
274 bool SetUniformMatrix(const char* name, vtkMatrix3x3* v);
275 bool SetUniformMatrix(const char* name, vtkMatrix4x4* v);
276 bool SetUniformMatrix3x3(const char* name, float* v);
277 bool SetUniformMatrix4x4(const char* name, float* v);
278
280 bool SetUniform1iv(const char* name, int count, const int* f);
281 bool SetUniform1fv(const char* name, int count, const float* f);
282 bool SetUniform2fv(const char* name, int count, const float* f);
283 bool SetUniform2fv(const char* name, int count, const float (*f)[2]);
284 bool SetUniform3fv(const char* name, int count, const float* f);
285 bool SetUniform3fv(const char* name, int count, const float (*f)[3]);
286 bool SetUniform4fv(const char* name, int count, const float* f);
287 bool SetUniform4fv(const char* name, int count, const float (*f)[4]);
288 bool SetUniformMatrix4x4v(const char* name, int count, float* v);
289
291
302 bool SetUniformi(int location, int v);
303 bool SetUniformf(int location, float v);
304 bool SetUniform3f(int location, const float v[3]);
305 bool SetUniform3f(int location, const double v[3]);
306 bool SetUniform4f(int location, const float v[4]);
307 bool SetUniform1fv(int location, int count, const float* f);
308 bool SetUniform4fv(int location, int count, const float* f);
309 bool SetUniformMatrix(int location, vtkMatrix3x3* v);
310 bool SetUniformMatrix(int location, vtkMatrix4x4* v);
311 bool SetUniformMatrix3x3(int location, float* v);
312 bool SetUniformMatrix4x4(int location, float* v);
313 bool SetUniformMatrix4x4v(int location, int count, float* v);
315
322 unsigned int GetLinkCount() const { return this->LinkCount; }
323
324 // How many outputs does this program produce
325 // only valid for OpenGL 3.2 or later
326 vtkSetMacro(NumberOfOutputs, unsigned int);
327
339 static bool Substitute(
340 std::string& source, const std::string& search, const std::string& replace, bool all = true);
341
353 static bool Substitute(
354 vtkShader* shader, const std::string& search, const std::string& replace, bool all = true);
355
361 bool IsUniformUsed(const char*);
362
367 bool IsAttributeUsed(const char* name);
368
369 // maps of std::string are super slow when calling find
370 // with a string literal or const char * as find
371 // forces construction/copy/destruction of a
372 // std::string copy of the const char *
373 // In spite of the doubters this can really be a
374 // huge CPU hog.
375 struct cmp_str
376 {
377 bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; }
378 };
379
381
398 vtkSetFilePathMacro(FileNamePrefixForDebugging);
399 vtkGetFilePathMacro(FileNamePrefixForDebugging);
401
403
409 {
412 UserGroup, // always will be last
413 };
417
418 // returns the location for a uniform or attribute in
419 // this program. Is cached for performance.
420 int FindUniform(const char* name);
421 int FindAttributeArray(const char* name);
422
423protected:
426
427 /***************************************************************
428 * The following functions are only for use by the shader cache
429 * which is why they are protected and that class is a friend
430 * you need to use the shader cache to compile/link/bind your shader
431 * do not try to do it yourself as it will screw up the cache
432 ***************************************************************/
434
441 bool AttachShader(const vtkShader* shader);
442
448 bool DetachShader(const vtkShader* shader);
449
453 virtual int CompileShader();
454
460 bool Link();
461
466 bool Bind();
467
469 void Release();
470
471 /************* end **************************************/
472
480
481 // hash of the shader program
482 std::string MD5Hash;
483
485 const char* name, void* buffer, int type, int tupleSize, NormalizeOption normalize);
493
494 bool Linked;
495 bool Bound;
497
498 // for glsl 1.5 or later, how many outputs
499 // does this shader create
500 // they will be bound in order to
501 // fragOutput0 fragOutput1 etc...
502 unsigned int NumberOfOutputs;
503
504 std::string Error;
505
506 // since we are using const char * arrays we have to
507 // free our memory :-)
508 void ClearMaps();
509 std::map<const char*, int, cmp_str> AttributeLocs;
510 std::map<const char*, int, cmp_str> UniformLocs;
511
512 std::map<int, vtkMTimeType> UniformGroupMTimes;
513
514 friend class VertexArrayObject;
515
516private:
517 vtkShaderProgram(const vtkShaderProgram&) = delete;
518 void operator=(const vtkShaderProgram&) = delete;
519
520 // print shader code and report error
521 void ReportShaderError(vtkShader* shader);
522
535 bool UniformValueChanged(int location, const void* data, std::size_t nbytes);
536
537 char* FileNamePrefixForDebugging;
538 std::vector<std::vector<unsigned char>> UniformValueCache;
539 // Bumped on every successful Link(); see GetLinkCount().
540 unsigned int LinkCount = 0;
541};
542
543VTK_ABI_NAMESPACE_END
544#endif
RealT tm
Definition PyrC2Basis.h:35
a simple class to control print indentation
Definition vtkIndent.h:108
represent and manipulate 3x3 transformation matrices
represent and manipulate 4x4 transformation matrices
bool Link()
Attempt to link the shader program.
bool SetUniform4fv(const char *name, int count, const float *f)
bool SetUniformMatrix3x3(int location, float *v)
Location-based uniform setters.
void Release()
Releases the shader program from the current context.
std::string GetHash() const
Set/Get the hash of this program.
void SetTessControlShader(vtkShader *)
Get/set the tess control shader for this program.
vtkShader * FragmentShader
bool SetUniformf(int location, float v)
Location-based uniform setters.
~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 SetUniform4f(int location, const float v[4])
Location-based uniform setters.
bool SetUniform3f(const char *name, const float v[3])
int FindAttributeArray(const char *name)
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])
static vtkShaderProgram * New()
int GetHandle() const
Get the handle of the shader program.
bool SetUniform1fv(const char *name, int count, const float *f)
unsigned int GetLinkCount() const
Number of times this program has been (re)linked.
NormalizeOption
Options for attribute normalization.
@ NoNormalize
The values should be used as-is. Do not perform any normalization.
@ Normalize
The values range across the limits of the numeric type.
bool SetUniform3f(const char *name, const double v[3])
vtkShader * TessControlShader
bool EnableAttributeArray(const char *name)
Enable the named attribute array.
bool SetUniformMatrix4x4(int location, float *v)
Location-based uniform setters.
vtkShader * VertexShader
bool SetUniform3f(int location, const double v[3])
Location-based uniform setters.
bool SetUniformMatrix(int location, vtkMatrix4x4 *v)
Location-based uniform setters.
vtkShader * ComputeShader
bool SetUniform4fv(int location, int count, const float *f)
Location-based uniform setters.
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(int location, vtkMatrix3x3 *v)
Location-based uniform setters.
bool SetUniform1fv(int location, int count, const float *f)
Location-based uniform setters.
bool SetUniformMatrix(const char *name, vtkMatrix3x3 *v)
std::map< const char *, int, cmp_str > AttributeLocs
bool SetUniformi(int location, int v)
Location-based uniform setters.
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.
void SetHash(const std::string &hash)
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 SetUniform3f(int location, const float v[3])
Location-based uniform setters.
bool SetUniformi(const char *name, int v)
Set the name uniform value to int v.
unsigned int NumberOfOutputs
bool SetUniformMatrix4x4v(int location, int count, float *v)
Location-based uniform setters.
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.
friend class VertexArrayObject
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.
friend class vtkOpenGLShaderCache
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:62
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:318