VTK
vtkShaderProgram2.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkShaderProgram2.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
28 #ifndef vtkShaderProgram2_h
29 #define vtkShaderProgram2_h
30 
31 #include <cassert> // for templated functions
32 #include "vtkRenderingOpenGLModule.h" // for export macro
33 #include "vtkWeakPointer.h" // for weak ptr to rendering context
34 #include "vtkObject.h"
35 
36 class vtkRenderWindow;
40 
41 // Values for GetLastBuildStatus()
43 {
44  // one of the shaders failed to compile
46  // all the shaders compiled successfully but the link failed
48  // all the shaders compiled successfully and the link succeeded
50 };
51 
53 {
59 };
60 
62 {
66 };
67 
68 class VTKRENDERINGOPENGL_EXPORT vtkShaderProgram2 : public vtkObject
69 {
70 public:
72  vtkTypeMacro(vtkShaderProgram2, vtkObject);
73  void PrintSelf(ostream& os, vtkIndent indent);
74 
79  static bool IsSupported(vtkRenderWindow *context);
80 
82 
90  vtkGetMacro(PrintErrors,bool);
91  vtkSetMacro(PrintErrors,bool);
93 
95 
101  void SetContext(vtkRenderWindow *context);
104 
106 
110  vtkGetObjectMacro(Shaders,vtkShader2Collection);
112 
119 
124 
129 
134 
142 
149  bool IsValid();
150 
158  void Build();
159 
166  void SendUniforms();
167 
174  void PrintActiveUniformVariables(ostream &os,
175  vtkIndent indent);
176 
184 
190  bool IsUsed();
191 
200  void Use();
201 
207  void Restore();
208 
217 
219 
223  void UseProgram();
224  void UnuseProgram();
226 
237 
243  const char *GetLastLinkLog();
244 
250  const char *GetLastValidateLog();
251 
255  virtual void ReleaseGraphicsResources();
256 
265  int GetAttributeLocation(const char *name);
266 
268 
272  vtkGetObjectMacro(UniformVariables,vtkUniformVariables);
273  virtual void SetUniformVariables(vtkUniformVariables *variables);
275 
286 
288 
301  vtkSetMacro(GeometryTypeIn,int);
302  vtkGetMacro(GeometryTypeIn,int);
304 
306 
318  vtkSetMacro(GeometryVerticesOut,int);
319  vtkGetMacro(GeometryVerticesOut,int);
321 
323 
334  vtkSetMacro(GeometryTypeOut,int);
335  vtkGetMacro(GeometryTypeOut,int);
337 
338  /*
339  Low level api --
340  this is provided as a way to avoid some of the overhead in this
341  class's implementation of SendUniforms. One should use the
342  following API if performance is a concern (eg. uniforms are
343  set per primative), or if the uniform management is not needed
344  (eg. variables are already managed in other vtkObjects)
345  */
346 
351  int GetUniformLocation(const char *name);
352 
360  void SetUniformf(const char *name, float val)
361  { this->SetUniform1f(name, &val); }
362  void SetUniform1f(const char *name, float *val)
363  { this->SetUniform1f(this->GetUniformLocation(name), val); }
364  void SetUniform2f(const char *name, float *val)
365  { this->SetUniform2f(this->GetUniformLocation(name), val); }
366  void SetUniform3f(const char *name, float *val)
367  { this->SetUniform3f(this->GetUniformLocation(name), val); }
368  void SetUniform4f(const char *name, float *val)
369  { this->SetUniform4f(this->GetUniformLocation(name), val); }
370 
371  void SetUniformi(const char *name, int val)
372  { this->SetUniform1i(name, &val); }
373  void SetUniform1i(const char *name, int *val)
374  { this->SetUniform1i(this->GetUniformLocation(name), val); }
375  void SetUniform2i(const char *name, int *val)
376  { this->SetUniform2i(this->GetUniformLocation(name), val); }
377  void SetUniform3i(const char *name, int *val)
378  { this->SetUniform3i(this->GetUniformLocation(name), val); }
379  void SetUniform4i(const char *name, int *val)
380  { this->SetUniform4i(this->GetUniformLocation(name), val); }
381 
382  void SetUniformf(int loc, float val)
383  { this->SetUniform1f(loc, &val); }
384  void SetUniform1f(int loc, float *val);
385  void SetUniform2f(int loc, float *val);
386  void SetUniform3f(int loc, float *val);
387  void SetUniform4f(int loc, float *val);
388 
389  void SetUniformi(int loc, int val)
390  { this->SetUniform1i(loc, &val); }
391  void SetUniform1i(int loc, int *val);
392  void SetUniform2i(int loc, int *val);
393  void SetUniform3i(int loc, int *val);
394  void SetUniform4i(int loc, int *val);
395 
397 
402  template<typename T> void SetUniform1it(const char *name, T *value);
403  template<typename T> void SetUniform2it(const char *name, T *value);
404  template<typename T> void SetUniform3it(const char *name, T *value);
405  template<typename T> void SetUniform4it(const char *name, T *value);
407 
408  template<typename T> void SetUniform1ft(const char *name, T *value);
409  template<typename T> void SetUniform2ft(const char *name, T *value);
410  template<typename T> void SetUniform3ft(const char *name, T *value);
411  template<typename T> void SetUniform4ft(const char *name, T *value);
412 
413  template<typename T> void SetUniform1it(int loc, T *value);
414  template<typename T> void SetUniform2it(int loc, T *value);
415  template<typename T> void SetUniform3it(int loc, T *value);
416  template<typename T> void SetUniform4it(int loc, T *value);
417 
418  template<typename T> void SetUniform1ft(int loc, T *value);
419  template<typename T> void SetUniform2ft(int loc, T *value);
420  template<typename T> void SetUniform3ft(int loc, T *value);
421  template<typename T> void SetUniform4ft(int loc, T *value);
422 
423 protected:
426 
431 
442 
443  unsigned int Id; // actually GLuint. Initial value is 0.
444  unsigned int SavedId;
445 
448 
451 
452  int LastBuildStatus; // Initial value is VTK_SHADER_PROGRAM2_COMPILE_FAILED
453 
454  char *LastLinkLog; // Initial value is the empty string ""='\0'
455  size_t LastLinkLogCapacity; // Initial value is 8.
456 
457  char *LastValidateLog; // Initial value is the empty string ""='\0'
458  size_t LastValidateLogCapacity; // Initial value is 8.
459 
460 
462 
465 
469 
470 private:
471  vtkShaderProgram2(const vtkShaderProgram2&) VTK_DELETE_FUNCTION;
472  void operator=(const vtkShaderProgram2&) VTK_DELETE_FUNCTION;
473 };
474 
475 // ----------------------------------------------------------------------------
476 
477 #define vtkShaderProgram2SetUniformCopyCastMacro(toLetter, toType, num) \
478 template<typename fromType> \
479 void vtkShaderProgram2::SetUniform##num##toLetter##t(const char *name, fromType *fvalues) \
480 { \
481  toType tvalues[num]; \
482  for (int i=0; i<num; ++i) \
483  { \
484  tvalues[i] = static_cast<toType>(fvalues[i]); \
485  } \
486  this->SetUniform##num##toLetter(name, tvalues); \
487 } \
488 template<typename fromType> \
489 void vtkShaderProgram2::SetUniform##num##toLetter##t(int location, fromType *fvalues) \
490 { \
491  assert(location!=-1); \
492  toType tvalues[num]; \
493  for (int i=0; i<num; ++i) \
494  { \
495  tvalues[i] = static_cast<toType>(fvalues[i]); \
496  } \
497  this->SetUniform##num##toLetter(location, tvalues); \
498 }
507 
508 #endif
vtkShaderProgram2::GetUniformLocationInternal
int GetUniformLocationInternal(const char *name)
Get the location of a uniform, without caring if it really exists.
VTK_SHADER_PROGRAM2_LINK_SUCCEEDED
@ VTK_SHADER_PROGRAM2_LINK_SUCCEEDED
Definition: vtkShaderProgram2.h:49
vtkShaderProgram2::SetUniform3i
void SetUniform3i(int loc, int *val)
vtkShaderProgram2::SetUniform3ft
void SetUniform3ft(const char *name, T *value)
vtkShaderProgram2::LastSendUniformsTime
vtkTimeStamp LastSendUniformsTime
Definition: vtkShaderProgram2.h:447
vtkShaderProgram2::SavedId
unsigned int SavedId
Definition: vtkShaderProgram2.h:444
vtkShaderProgram2::SetUniform2f
void SetUniform2f(const char *name, float *val)
Definition: vtkShaderProgram2.h:364
vtkShaderProgram2::SetUniformi
void SetUniformi(const char *name, int val)
Definition: vtkShaderProgram2.h:371
vtkShaderProgram2::SetUniform2it
void SetUniform2it(int loc, T *value)
vtkShaderProgram2::SetUniform1f
void SetUniform1f(int loc, float *val)
vtkShaderProgram2::SetUniform4it
void SetUniform4it(int loc, T *value)
VTK_GEOMETRY_SHADER_OUT_TYPE_TRIANGLE_STRIP
@ VTK_GEOMETRY_SHADER_OUT_TYPE_TRIANGLE_STRIP
Definition: vtkShaderProgram2.h:65
vtkX3D::value
@ value
Definition: vtkX3D.h:220
vtkShaderProgram2SetUniformCopyCastMacro
#define vtkShaderProgram2SetUniformCopyCastMacro(toLetter, toType, num)
Definition: vtkShaderProgram2.h:477
vtkShaderProgram2::Shaders
vtkShader2Collection * Shaders
Definition: vtkShaderProgram2.h:449
vtkShader2Collection
a list of Shader2 objects.
Definition: vtkShader2Collection.h:36
vtkTimeStamp
record modification and/or execution time
Definition: vtkTimeStamp.h:36
vtkShaderProgram2::DisplayListUnderCreationInCompileMode
bool DisplayListUnderCreationInCompileMode()
Tells if a display list is under construction with GL_COMPILE mode.
vtkShaderProgram2::HasVertexShaders
bool HasVertexShaders()
Tells if at least one of the shaders is a vertex shader.
vtkShaderProgram2::IsUsed
bool IsUsed()
Tell if the program is the one currently used by OpenGL.
vtkShaderProgram2::ReleaseGraphicsResources
virtual void ReleaseGraphicsResources()
Release OpenGL resource (program id and sub-resources).
vtkShaderProgram2GeometryOutType
vtkShaderProgram2GeometryOutType
Definition: vtkShaderProgram2.h:62
vtkShaderProgram2::GetAttributeLocation
int GetAttributeLocation(const char *name)
Returns the generic attribute location.
vtkObject
abstract base class for most VTK objects
Definition: vtkObject.h:60
vtkShaderProgram2::SetUniformVariables
virtual void SetUniformVariables(vtkUniformVariables *variables)
vtkShaderProgram2::LastLinkTime
vtkTimeStamp LastLinkTime
Definition: vtkShaderProgram2.h:446
vtkShaderProgram2::UniformVariables
vtkUniformVariables * UniformVariables
Definition: vtkShaderProgram2.h:450
vtkShaderProgram2::SetUniform1f
void SetUniform1f(const char *name, float *val)
Definition: vtkShaderProgram2.h:362
VTK_SHADER_PROGRAM2_LINK_FAILED
@ VTK_SHADER_PROGRAM2_LINK_FAILED
Definition: vtkShaderProgram2.h:47
VTK_GEOMETRY_SHADER_OUT_TYPE_POINTS
@ VTK_GEOMETRY_SHADER_OUT_TYPE_POINTS
Definition: vtkShaderProgram2.h:63
vtkShaderProgram2::GetContext
vtkRenderWindow * GetContext()
vtkShaderProgram2::HasGeometryShaders
bool HasGeometryShaders()
Tells if at least one of the shaders is a geometry shader.
vtkShaderProgram2::Restore
void Restore()
Restore the previous shader program (or fixed-pipeline).
vtkShaderProgram2::PrintActiveUniformVariablesOnCout
void PrintActiveUniformVariablesOnCout()
Call PrintActiveUniformVariables on cout.
vtkShaderProgram2::GeometryTypeOut
int GeometryTypeOut
Definition: vtkShaderProgram2.h:467
vtkShaderProgram2::ExtensionsLoaded
bool ExtensionsLoaded
Definition: vtkShaderProgram2.h:464
vtkShaderProgram2::SetUniform1ft
void SetUniform1ft(const char *name, T *value)
vtkShaderProgram2::GeometryVerticesOut
int GeometryVerticesOut
Definition: vtkShaderProgram2.h:468
vtkShaderProgram2::HasTessellationEvaluationShaders
bool HasTessellationEvaluationShaders()
Tells if at least one of the shaders is a tessellation evaluation shader.
vtkShaderProgram2::SetUniform1it
void SetUniform1it(const char *name, T *value)
Convenience methods for copy/convert to supported type.
vtkShaderProgram2::SetUniform2ft
void SetUniform2ft(const char *name, T *value)
vtkShaderProgram2::SetUniform4it
void SetUniform4it(const char *name, T *value)
VTK_GEOMETRY_SHADER_IN_TYPE_LINES
@ VTK_GEOMETRY_SHADER_IN_TYPE_LINES
Definition: vtkShaderProgram2.h:55
vtkShaderProgram2::SetUniformf
void SetUniformf(int loc, float val)
Definition: vtkShaderProgram2.h:382
vtkShaderProgram2::SetUniform1ft
void SetUniform1ft(int loc, T *value)
vtkShaderProgram2::SetUniform3i
void SetUniform3i(const char *name, int *val)
Definition: vtkShaderProgram2.h:377
vtkOpenGLExtensionManager
Interface class for querying and using OpenGL extensions.
VTK_GEOMETRY_SHADER_IN_TYPE_TRIANGLES
@ VTK_GEOMETRY_SHADER_IN_TYPE_TRIANGLES
Definition: vtkShaderProgram2.h:57
vtkShaderProgram2GeometryInType
vtkShaderProgram2GeometryInType
Definition: vtkShaderProgram2.h:53
vtkShaderProgram2::LastValidateLogCapacity
size_t LastValidateLogCapacity
Definition: vtkShaderProgram2.h:458
vtkShaderProgram2::SetUniform2i
void SetUniform2i(int loc, int *val)
vtkShaderProgram2::SetUniform4f
void SetUniform4f(int loc, float *val)
vtkShaderProgram2::SetUniform1i
void SetUniform1i(int loc, int *val)
vtkShaderProgram2::GetLastValidateLog
const char * GetLastValidateLog()
Return the log of the last call to IsValid as a string.
vtkShaderProgram2::SetUniform4f
void SetUniform4f(const char *name, float *val)
Definition: vtkShaderProgram2.h:368
vtkShaderProgram2::SetUniform4i
void SetUniform4i(int loc, int *val)
vtkShaderProgram2::SetContext
void SetContext(vtkRenderWindow *context)
Get/Set the context.
vtkShaderProgram2::SendUniforms
void SendUniforms()
Send the uniform variables values to the program.
vtkShaderProgram2::RestoreFixedPipeline
void RestoreFixedPipeline()
Force the current shader program to be the fixed-pipeline.
vtkShaderProgram2::LastBuildStatus
int LastBuildStatus
Definition: vtkShaderProgram2.h:452
vtkIndent
a simple class to control print indentation
Definition: vtkIndent.h:40
vtkShaderProgram2::SetUniform4i
void SetUniform4i(const char *name, int *val)
Definition: vtkShaderProgram2.h:379
vtkShaderProgram2::UnuseProgram
void UnuseProgram()
vtkShaderProgram2::UseProgram
void UseProgram()
Simple direct use of the program without side affects and with error check.
vtkShaderProgram2::GetUniformLocation
int GetUniformLocation(const char *name)
Get a uniform's location.
vtkWeakPointer.h
vtkShaderProgram2::IsValid
bool IsValid()
Tell if the shader program is valid with the current OpenGL state.
vtkUniformVariables
GLSL uniform variables.
Definition: vtkUniformVariables.h:39
VTK_GEOMETRY_SHADER_IN_TYPE_TRIANGLES_ADJACENCY
@ VTK_GEOMETRY_SHADER_IN_TYPE_TRIANGLES_ADJACENCY
Definition: vtkShaderProgram2.h:58
vtkShaderProgram2::PrintActiveUniformVariables
void PrintActiveUniformVariables(ostream &os, vtkIndent indent)
Introspection.
vtkShaderProgram2::LoadRequiredExtensions
bool LoadRequiredExtensions(vtkRenderWindow *context)
Load the required OpenGL extentions.
VTK_GEOMETRY_SHADER_IN_TYPE_LINES_ADJACENCY
@ VTK_GEOMETRY_SHADER_IN_TYPE_LINES_ADJACENCY
Definition: vtkShaderProgram2.h:56
vtkShaderProgram2::vtkShaderProgram2
vtkShaderProgram2()
vtkShaderProgram2::New
static vtkShaderProgram2 * New()
vtkX3D::name
@ name
Definition: vtkX3D.h:219
vtkObject.h
vtkShaderProgram2::SetUniform2f
void SetUniform2f(int loc, float *val)
vtkShaderProgram2::PrintSelf
void PrintSelf(ostream &os, vtkIndent indent)
Methods invoked by print to print information about the object including superclasses.
vtkShaderProgram2::Use
void Use()
Use the shader program.
vtkShaderProgram2::SetUniform2it
void SetUniform2it(const char *name, T *value)
vtkSetMacro
vtkSetMacro(IgnoreDriverBugs, bool)
Updates the extensions string.
vtkShaderProgram2::SetUniform2i
void SetUniform2i(const char *name, int *val)
Definition: vtkShaderProgram2.h:375
vtkShaderProgram2::SetUniformf
void SetUniformf(const char *name, float val)
Set a uniform value directly.
Definition: vtkShaderProgram2.h:360
vtkShaderProgram2::SetUniform4ft
void SetUniform4ft(int loc, T *value)
vtkShaderProgram2
GLSL Program.
Definition: vtkShaderProgram2.h:69
vtkShaderProgram2::SetUniform1it
void SetUniform1it(int loc, T *value)
vtkShaderProgram2::Id
unsigned int Id
Definition: vtkShaderProgram2.h:443
vtkShaderProgram2::SetUniform2ft
void SetUniform2ft(int loc, T *value)
VTK_GEOMETRY_SHADER_IN_TYPE_POINTS
@ VTK_GEOMETRY_SHADER_IN_TYPE_POINTS
Definition: vtkShaderProgram2.h:54
vtkShaderProgram2::IsSupported
static bool IsSupported(vtkRenderWindow *context)
Returns if the context supports the required extensions.
vtkShaderProgram2::LastLinkLog
char * LastLinkLog
Definition: vtkShaderProgram2.h:454
vtkShaderProgram2::SetUniform3it
void SetUniform3it(int loc, T *value)
vtkShaderProgram2::SetUniformi
void SetUniformi(int loc, int val)
Definition: vtkShaderProgram2.h:389
vtkShaderProgram2::GetLastBuildStatus
int GetLastBuildStatus()
Tells if the last build: failed during compilation of one of the shader, fails during link of the pro...
vtkShaderProgram2::SetUniform3ft
void SetUniform3ft(int loc, T *value)
vtkShaderProgram2::GeometryTypeIn
int GeometryTypeIn
Definition: vtkShaderProgram2.h:466
vtkShaderProgram2::PrintErrors
bool PrintErrors
Definition: vtkShaderProgram2.h:461
vtkRenderWindow
create a window for renderers to draw into
Definition: vtkRenderWindow.h:87
vtkShaderProgram2::~vtkShaderProgram2
virtual ~vtkShaderProgram2()
vtkShaderProgram2::SetUniform3it
void SetUniform3it(const char *name, T *value)
vtkShaderProgram2::GetLastLinkLog
const char * GetLastLinkLog()
Return the log of the last link as a string.
vtkShaderProgram2::SetUniform3f
void SetUniform3f(int loc, float *val)
vtkShaderProgram2::SetUniform3f
void SetUniform3f(const char *name, float *val)
Definition: vtkShaderProgram2.h:366
VTK_GEOMETRY_SHADER_OUT_TYPE_LINE_STRIP
@ VTK_GEOMETRY_SHADER_OUT_TYPE_LINE_STRIP
Definition: vtkShaderProgram2.h:64
vtkShaderProgram2BuildStatus
vtkShaderProgram2BuildStatus
Definition: vtkShaderProgram2.h:43
vtkShaderProgram2::SetUniform1i
void SetUniform1i(const char *name, int *val)
Definition: vtkShaderProgram2.h:373
vtkShaderProgram2::LastLinkLogCapacity
size_t LastLinkLogCapacity
Definition: vtkShaderProgram2.h:455
vtkShaderProgram2::Build
void Build()
If not done yet, compile all the shaders and link the program.
vtkShaderProgram2::SetUniform4ft
void SetUniform4ft(const char *name, T *value)
vtkShaderProgram2::Context
vtkWeakPointer< vtkRenderWindow > Context
Definition: vtkShaderProgram2.h:463
vtkWeakPointer< vtkRenderWindow >
VTK_SHADER_PROGRAM2_COMPILE_FAILED
@ VTK_SHADER_PROGRAM2_COMPILE_FAILED
Definition: vtkShaderProgram2.h:45
vtkShaderProgram2::HasFragmentShaders
bool HasFragmentShaders()
Tells if at least one of the shaders is a fragment shader.
vtkShaderProgram2::HasTessellationControlShaders
bool HasTessellationControlShaders()
Tells if at least one of the shaders is a tessellation control shader.
vtkShaderProgram2::LastValidateLog
char * LastValidateLog
Definition: vtkShaderProgram2.h:457