VTK  9.4.20241218
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
83VTK_ABI_NAMESPACE_BEGIN
84class vtkMatrix3x3;
85class vtkMatrix4x4;
87class vtkShader;
88class VertexArrayObject;
89class vtkWindow;
90
100class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
101{
102public:
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
387protected:
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 ***************************************************************/
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
446 std::string MD5Hash;
447
449 const char* name, void* buffer, int type, int tupleSize, NormalizeOption normalize);
457
458 bool Linked;
459 bool Bound;
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
468 std::string Error;
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
480private:
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
490VTK_ABI_NAMESPACE_END
491#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
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)
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])
static vtkShaderProgram * New()
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
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