HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SlangShaderGenerator.h
Go to the documentation of this file.
1 //
2 // Copyright Contributors to the MaterialX Project
3 // SPDX-License-Identifier: Apache-2.0
4 //
5 
6 #ifndef MATERIALX_SLANGSHADERGENERATOR_H
7 #define MATERIALX_SLANGSHADERGENERATOR_H
8 
9 /// @file
10 /// Slang shader generator
11 
13 
15 
17 
18 using SlangShaderGeneratorPtr = shared_ptr<class SlangShaderGenerator>;
19 
20 /// Base class for Slang code generation.
21 /// A generator for a specific Slang target should be derived from this class.
23 {
24  public:
25  /// Constructor.
27 
28  /// Creator function.
29  /// If a TypeSystem is not provided it will be created internally.
30  /// Optionally pass in an externally created TypeSystem here,
31  /// if you want to keep type descriptions alive after the lifetime
32  /// of the shader generator.
33  static ShaderGeneratorPtr create(TypeSystemPtr typeSystem = nullptr)
34  {
35  return std::make_shared<SlangShaderGenerator>(typeSystem ? typeSystem : TypeSystem::create());
36  }
37 
38  /// Generate a shader starting from the given element, translating
39  /// the element and all dependencies upstream into shader code.
40  ShaderPtr generate(const string& name, ElementPtr element, GenContext& context) const override;
41 
42  /// Return a unique identifier for the target this generator is for
43  const string& getTarget() const override { return TARGET; }
44 
45  /// Return the version string for the Slang version this generator is for
46  virtual const string& getVersion() const { return VERSION; }
47 
48  /// Emit a shader variable.
49  void emitVariableDeclaration(const ShaderPort* variable, const string& qualifier, GenContext& context, ShaderStage& stage,
50  bool assignValue = true) const override;
51 
52  /// Determine the prefix of vertex data variables.
53  string getVertexDataPrefix(const VariableBlock& vertexData) const override;
54 
55  public:
56  /// Unique identifier for this generator target
57  static const string TARGET;
58 
59  /// Version string for the generator target
60  static const string VERSION;
61 
62  protected:
63  virtual void emitVertexStage(const ShaderGraph& graph, GenContext& context, ShaderStage& stage) const;
64  virtual void emitPixelStage(const ShaderGraph& graph, GenContext& context, ShaderStage& stage) const;
65 
66  virtual void emitDirectives(GenContext& context, ShaderStage& stage) const;
67  virtual void emitConstants(GenContext& context, ShaderStage& stage) const;
68  virtual void emitUniforms(GenContext& context, ShaderStage& stage, bool emitLighting) const;
69  virtual void emitInputs(GenContext& context, ShaderStage& stage) const;
70  virtual void emitOutputs(GenContext& context, ShaderStage& stage) const;
71 
72  /// Logic to indicate whether code to support direct lighting should be emitted.
73  /// By default if the graph is classified as a shader, or BSDF node then lighting is assumed to be required.
74  /// Derived classes can override this logic.
75  virtual bool requiresLighting(const ShaderGraph& graph) const override;
76 
77  /// Emit specular environment lookup code
78  virtual void emitSpecularEnvironment(GenContext& context, ShaderStage& stage) const;
79 
80  /// Emit transmission rendering code
81  virtual void emitTransmissionRender(GenContext& context, ShaderStage& stage) const;
82 
83  /// Emit function definitions for lighting code
84  virtual void emitLightFunctionDefinitions(const ShaderGraph& graph, GenContext& context, ShaderStage& stage) const;
85 
86  static void toVec4(TypeDesc type, string& variable);
87  [[deprecated]] static void toVec4(const TypeDesc* type, string& variable) { toVec4(*type, variable); }
88 
89  void SlangSyntaxFromGlsl(ShaderStage& shaderStage) const;
90 
91  /// Nodes used internally for light sampling.
92  vector<ShaderNodePtr> _lightSamplingNodes;
93 };
94 
96 
97 #endif
void toVec4(TypeDesc type, string &variable) const
const string & getTarget() const override
Return a unique identifier for the target this generator is for.
#define MATERIALX_NAMESPACE_BEGIN
Definition: Generated.h:25
virtual void emitVariableDeclaration(const ShaderPort *variable, const string &qualifier, GenContext &context, ShaderStage &stage, bool assignValue=true) const
static const string TARGET
Unique identifier for this generator target.
static TypeSystemPtr create()
Create a new type system.
shared_ptr< class TypeSystem > TypeSystemPtr
Definition: TypeDesc.h:219
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
virtual string getVertexDataPrefix(const VariableBlock &vertexData) const =0
Determine the prefix of vertex data variables.
virtual bool requiresLighting(const ShaderGraph &graph) const
static const string VERSION
Version string for the generator target.
virtual const string & getVersion() const
Return the version string for the Slang version this generator is for.
GLuint const GLchar * name
Definition: glcorearb.h:786
static void toVec4(const TypeDesc *type, string &variable)
#define MX_GENSLANG_API
Definition: Export.h:18
vector< ShaderNodePtr > _lightSamplingNodes
Nodes used internally for light sampling.
shared_ptr< class SlangShaderGenerator > SlangShaderGeneratorPtr
shared_ptr< Shader > ShaderPtr
Shared pointer to a Shader.
Definition: Library.h:33
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition: Element.h:31
#define MATERIALX_NAMESPACE_END
Definition: Generated.h:26
static ShaderGeneratorPtr create(TypeSystemPtr typeSystem=nullptr)
shared_ptr< ShaderGenerator > ShaderGeneratorPtr
Shared pointer to a ShaderGenerator.
Definition: Library.h:37
virtual ShaderPtr generate(const string &, ElementPtr, GenContext &) const