forked from AcademySoftwareFoundation/MaterialX
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGlslShaderGenerator.h
More file actions
125 lines (92 loc) · 4.59 KB
/
GlslShaderGenerator.h
File metadata and controls
125 lines (92 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//
// TM & (c) 2017 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd.
// All rights reserved. See LICENSE.txt for license.
//
#ifndef MATERIALX_GLSLSHADERGENERATOR_H
#define MATERIALX_GLSLSHADERGENERATOR_H
/// @file
/// GLSL shader generator
#include <MaterialXGenGlsl/Export.h>
#include <MaterialXGenShader/HwShaderGenerator.h>
MATERIALX_NAMESPACE_BEGIN
using GlslShaderGeneratorPtr = shared_ptr<class GlslShaderGenerator>;
/// Base class for GLSL (OpenGL Shading Language) code generation.
/// A generator for a specific GLSL target should be derived from this class.
class MX_GENGLSL_API GlslShaderGenerator : public HwShaderGenerator
{
public:
GlslShaderGenerator();
static ShaderGeneratorPtr create() { return std::make_shared<GlslShaderGenerator>(); }
/// Generate a shader starting from the given element, translating
/// the element and all dependencies upstream into shader code.
ShaderPtr generate(const string& name, ElementPtr element, GenContext& context) const override;
/// Return a unique identifier for the target this generator is for
const string& getTarget() const override { return TARGET; }
/// Return the version string for the GLSL version this generator is for
virtual const string& getVersion() const { return VERSION; }
/// Emit a shader variable.
void emitVariableDeclaration(const ShaderPort* variable, const string& qualifier, GenContext& context, ShaderStage& stage,
bool assignValue = true) const override;
/// Return a registered shader node implementation given an implementation element.
/// The element must be an Implementation or a NodeGraph acting as implementation.
ShaderNodeImplPtr getImplementation(const NodeDef& nodedef, GenContext& context) const override;
/// Determine the prefix of vertex data variables.
virtual string getVertexDataPrefix(const VariableBlock& vertexData) const;
public:
/// Unique identifier for this generator target
static const string TARGET;
/// Version string for the generator target
static const string VERSION;
protected:
virtual void emitVertexStage(const ShaderGraph& graph, GenContext& context, ShaderStage& stage) const;
virtual void emitPixelStage(const ShaderGraph& graph, GenContext& context, ShaderStage& stage) const;
virtual void emitDirectives(GenContext& context, ShaderStage& stage) const;
virtual void emitConstants(GenContext& context, ShaderStage& stage) const;
virtual void emitUniforms(GenContext& context, ShaderStage& stage) const;
virtual void emitLightData(GenContext& context, ShaderStage& stage) const;
virtual void emitInputs(GenContext& context, ShaderStage& stage) const;
virtual void emitOutputs(GenContext& context, ShaderStage& stage) const;
virtual HwResourceBindingContextPtr getResourceBindingContext(GenContext& context) const;
/// Logic to indicate whether code to support direct lighting should be emitted.
/// By default if the graph is classified as a shader, or BSDF node then lighting is assumed to be required.
/// Derived classes can override this logic.
virtual bool requiresLighting(const ShaderGraph& graph) const;
/// Emit specular environment lookup code
virtual void emitSpecularEnvironment(GenContext& context, ShaderStage& stage) const;
/// Emit transmission rendering code
virtual void emitTransmissionRender(GenContext& context, ShaderStage& stage) const;
/// Emit function definitions for lighting code
virtual void emitLightFunctionDefinitions(const ShaderGraph& graph, GenContext& context, ShaderStage& stage) const;
static void toVec4(const TypeDesc* type, string& variable);
/// Nodes used internally for light sampling.
vector<ShaderNodePtr> _lightSamplingNodes;
};
/// Base class for common GLSL node implementations
class MX_GENGLSL_API GlslImplementation : public ShaderNodeImpl
{
public:
const string& getTarget() const override;
bool isEditable(const ShaderInput& input) const override;
protected:
GlslImplementation() {}
// Integer identifiers for coordinate spaces.
// The order must match the order given for
// the space enum string in stdlib.
enum Space
{
MODEL_SPACE = 0,
OBJECT_SPACE = 1,
WORLD_SPACE = 2
};
/// Internal string constants
static const string SPACE;
static const string TO_SPACE;
static const string FROM_SPACE;
static const string WORLD;
static const string OBJECT;
static const string MODEL;
static const string INDEX;
static const string GEOMPROP;
};
MATERIALX_NAMESPACE_END
#endif