VTK  9.3.0
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
22#ifndef vtkShaderProgram_h
23#define vtkShaderProgram_h
24
25#include "vtkObject.h"
26#include "vtkRenderingOpenGL2Module.h" // for export macro
27
28#include <map> // For member variables.
29#include <string> // For member variables.
30
31VTK_ABI_NAMESPACE_BEGIN
32class vtkMatrix3x3;
33class vtkMatrix4x4;
35class vtkShader;
36class VertexArrayObject;
37class vtkWindow;
38
46class VTKRENDERINGOPENGL2_EXPORT vtkShaderProgram : public vtkObject
47{
48public:
51 void PrintSelf(ostream& os, vtkIndent indent) override;
52
54
57 vtkGetObjectMacro(VertexShader, vtkShader);
60
62
65 vtkGetObjectMacro(FragmentShader, vtkShader);
68
70
73 vtkGetObjectMacro(GeometryShader, vtkShader);
76
78
81 vtkGetObjectMacro(TransformFeedback, vtkTransformFeedback);
84
86
89 vtkGetMacro(Compiled, bool);
90 vtkSetMacro(Compiled, bool);
91 vtkBooleanMacro(Compiled, bool);
93
97 std::string GetMD5Hash() const { return this->MD5Hash; }
98 void SetMD5Hash(const std::string& hash) { this->MD5Hash = hash; }
99
102 {
113 NoNormalize
114 };
115
120 bool isBound() const { return this->Bound; }
121
126
128 int GetHandle() const { return Handle; }
129
131 std::string GetError() const { return Error; }
132
137 bool EnableAttributeArray(const char* name);
138
143 bool DisableAttributeArray(const char* name);
144
160 bool UseAttributeArray(const char* name, int offset, size_t stride, int elementType,
161 int elementTupleSize, NormalizeOption normalize);
162
180 template <class T>
182 const char* name, const T& array, int tupleSize, NormalizeOption normalize);
183
185 bool SetUniformi(const char* name, int v);
186 bool SetUniformf(const char* name, float v);
187 bool SetUniform2i(const char* name, const int v[2]);
188 bool SetUniform2f(const char* name, const float v[2]);
189 bool SetUniform3f(const char* name, const float v[3]);
190 bool SetUniform3f(const char* name, const double v[3]);
191 bool SetUniform4f(const char* name, const float v[4]);
192 bool SetUniform3uc(const char* name, const unsigned char v[3]); // maybe remove
193 bool SetUniform4uc(const char* name, const unsigned char v[4]); // maybe remove
194 bool SetUniformMatrix(const char* name, vtkMatrix3x3* v);
195 bool SetUniformMatrix(const char* name, vtkMatrix4x4* v);
196 bool SetUniformMatrix3x3(const char* name, float* v);
197 bool SetUniformMatrix4x4(const char* name, float* v);
198
200 bool SetUniform1iv(const char* name, int count, const int* f);
201 bool SetUniform1fv(const char* name, int count, const float* f);
202 bool SetUniform2fv(const char* name, int count, const float* f);
203 bool SetUniform2fv(const char* name, int count, const float (*f)[2]);
204 bool SetUniform3fv(const char* name, int count, const float* f);
205 bool SetUniform3fv(const char* name, int count, const float (*f)[3]);
206 bool SetUniform4fv(const char* name, int count, const float* f);
207 bool SetUniform4fv(const char* name, int count, const float (*f)[4]);
208 bool SetUniformMatrix4x4v(const char* name, 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(
226 std::string& source, const std::string& search, const std::string& replace, bool all = true);
227
239 static bool Substitute(
240 vtkShader* shader, const std::string& search, const std::string& replace, bool all = true);
241
247 bool IsUniformUsed(const char*);
248
253 bool IsAttributeUsed(const char* name);
254
255 // maps of std::string are super slow when calling find
256 // with a string literal or const char * as find
257 // forces construction/copy/destruction of a
258 // std::string copy of the const char *
259 // In spite of the doubters this can really be a
260 // huge CPU hog.
261 struct cmp_str
262 {
263 bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; }
264 };
265
267
284 vtkSetFilePathMacro(FileNamePrefixForDebugging);
285 vtkGetFilePathMacro(FileNamePrefixForDebugging);
287
289
295 {
298 UserGroup, // always will be last
299 };
303
304 // returns the location for a uniform or attribute in
305 // this program. Is cached for performance.
306 int FindUniform(const char* name);
307 int FindAttributeArray(const char* name);
308
309protected:
312
313 /***************************************************************
314 * The following functions are only for use by the shader cache
315 * which is why they are protected and that class is a friend
316 * you need to use the shader cache to compile/link/bind your shader
317 * do not try to do it yourself as it will screw up the cache
318 ***************************************************************/
320
327 bool AttachShader(const vtkShader* shader);
328
334 bool DetachShader(const vtkShader* shader);
335
339 virtual int CompileShader();
340
346 bool Link();
347
352 bool Bind();
353
355 void Release();
356
357 /************* end **************************************/
358
363
364 // hash of the shader program
365 std::string MD5Hash;
366
368 const char* name, void* buffer, int type, int tupleSize, NormalizeOption normalize);
373
374 bool Linked;
375 bool Bound;
377
378 // for glsl 1.5 or later, how many outputs
379 // does this shader create
380 // they will be bound in order to
381 // fragOutput0 fragOutput1 etc...
382 unsigned int NumberOfOutputs;
383
384 std::string Error;
385
386 // since we are using const char * arrays we have to
387 // free our memory :-)
388 void ClearMaps();
389 std::map<const char*, int, cmp_str> AttributeLocs;
390 std::map<const char*, int, cmp_str> UniformLocs;
391
392 std::map<int, vtkMTimeType> UniformGroupMTimes;
393
394 friend class VertexArrayObject;
395
396private:
397 vtkShaderProgram(const vtkShaderProgram&) = delete;
398 void operator=(const vtkShaderProgram&) = delete;
399
400 char* FileNamePrefixForDebugging;
401};
402
403VTK_ABI_NAMESPACE_END
404#endif
a simple class to control print indentation
Definition vtkIndent.h:38
represent and manipulate 3x3 transformation matrices
represent and manipulate 4x4 transformation matrices
abstract base class for most VTK objects
Definition vtkObject.h:58
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.
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 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 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])
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 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.
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 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 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...
Vertex or Fragment shader, combined into a ShaderProgram.
Definition vtkShader.h:37
Manages a TransformFeedback buffer.
window superclass for vtkRenderWindow
Definition vtkWindow.h:34
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