Developer Documentation

Classes | Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
ACG::ShaderGenerator Class Reference

`#include <OpenFlipper/libs_required/ACG/GL/ShaderGenerator.hh>`

## Classes
struct | DefaultIODesc
struct | Keywords

## Public Member Functions
void | setGLSLVersion (int _version)
| Set glsl version.
void | addIncludeFile (QString _fileName)
| Imports another shader, same as #include.
void | initVertexShaderIO (const ShaderGenDesc *_desc, const DefaultIODesc *_iodesc)
| Adds fitting vertex shader io for a given description. More...
void | initTessControlShaderIO (const ShaderGenDesc *_desc, ShaderGenerator *_prevStage, const DefaultIODesc *_iodesc)
| Adds fitting tess-control shader io for a given description.
void | initTessEvalShaderIO (const ShaderGenDesc *_desc, ShaderGenerator *_prevStage, const DefaultIODesc *_iodesc)
| Adds fitting tess-evaluation shader io for a given description.
void | initGeometryShaderIO (const ShaderGenDesc *_desc, ShaderGenerator *_prevStage, const DefaultIODesc *_iodesc)
| Adds fitting geometry shader io for a given description.
void | initFragmentShaderIO (const ShaderGenDesc *_desc, ShaderGenerator *_prevStage, const DefaultIODesc *_iodesc)
| Adds fitting fragment shader io for a given description.
void | initDefaultUniforms ()
| Adds frequently used uniform parameters. More...
void | addInput (const QString &_input)
| Add one GLSL input specifier. More...
void | addInput (const QString &_type, const QString &_varname)
| Add one GLSL input specifier. More...
void | addOutput (const QString &_output)
| Add one GLSL output specifier. More...
void | addOutput (const QString &_type, const QString &_varname)
| Add one GLSL output specifier. More...
void | addUniform (QString _uniform, QString _comment="")
| Add one GLSL uniform specifier. More...
void | addDefine (const QString &_define)
| Add one define. More...
void | addIODefine (const QString &_macroName, const QString &_resolvedName)
| Assign an opaque name to the abstract macro. More...
void | addMacros (const QStringList &_macros)
| Add a list of preprocessor macros. More...
bool | hasDefine (QString _define) const
| Check for define. More...
void | addLayout (QString _layout)
| Add a layout directive. More...
void | addRawIOBlock (QStringList _codeBlock)
| Add a raw glsl IO code block. More...
void | addLight (int lightIndex_, ShaderGenLightType _light)
| Add a light description to shader:
void | buildShaderCode (QStringList *_pMainCode, const QStringList &_defaultLightingFunctions)
| Shader assembly function. More...
const QStringList & | getShaderCode ()
| Get result of buildShaderCode.
void | saveToFile (const char *_fileName)
| Save generated shader code to text file. More...
void | matchInputs (const ShaderGenerator *_previousShaderStage, bool _passToNextStage, QString _inputPrefix="outVertex", QString _outputPrefix="outGeometry")
| Perform name matching of outputs and inputs between two shader stages. More...
void | defineIOAbstraction (const DefaultIODesc *_iodesc, bool _vs, bool _fs)
| Define abstract IO names via shader defines. More...
int | getNumOutputs () const
| get number of outputs
QString | getOutputName (int _id) const
| get variable name of output More...
int | getNumInputs () const
| get number of inputs
QString | getInputName (int _id) const
| get variable name of input More...
QString | getIOMapName (int _inId) const
| get corresponding output name of an input id More...

## Static Public Attributes
static const Keywords | keywords

## Private Member Functions
void | addStringToList (QString _str, QStringList *_list, QString _prefix="", QString _postfix="")
void | addIOToCode (const QStringList &_cmds)

## Private Attributes
QStringList | code_
QStringList | imports_
| glsl code imports (with #include )
int | version_
QStringList | inputs_
QStringList | outputs_
QStringList | uniforms_
QStringList | genDefines_
QStringList | layouts_
QStringList | rawIO_
| io block as glsl code
bool | inputArrays_
| inputs of shader are arrays (tess-control, tess-eval, geometry)
bool | outputArrays_
| outputs of shader are arrays (tess-control)
QString | inputPrefix_
| prefix of inputs to this shader, same as prefix of ouputs of previous stage
QString | outputPrefix_
| prefix of outputs of this shader

## Detailed Description

The ShaderGenerator is used to collect shader io, uniforms, defines and includes.

The shader main-function is not generated here and must be provided as a parameter to the buildShaderCode function.

Definition at line 557 of file ShaderGenerator.hh.

## Member Function Documentation

## ◆ addDefine()

void ACG::ShaderGenerator::addDefine | ( | const QString & | _define | ) |

Add one define.

Example:

#define SG_GOURAUD 1

Definition at line 470 of file ShaderGenerator.cc.

## ◆ addInput() [1/2]

void ACG::ShaderGenerator::addInput | ( | const QString & | _input | ) |

Add one GLSL input specifier.

Stores string pointer only Example:

in vec4 inPosition;

Definition at line 458 of file ShaderGenerator.cc.

## ◆ addInput() [2/2]

void ACG::ShaderGenerator::addInput | ( | const QString & | _type,
|  | const QString & | _varname
| ) |  |
| inline

Add one GLSL input specifier.

Stores string pointer only Example:

in vec4 inPosition;

Definition at line 639 of file ShaderGenerator.hh.

## ◆ addIODefine()

void ACG::ShaderGenerator::addIODefine | ( | const QString & | _macroName,
|  | const QString & | _resolvedName
| ) |  |

Assign an opaque name to the abstract macro.

Definition at line 476 of file ShaderGenerator.cc.

## ◆ addIOToCode()

void ACG::ShaderGenerator::addIOToCode | ( | const QStringList & | _cmds | ) |
| private

Adds command lines to the shader code. Eventually appends missing ';'

Definition at line 539 of file ShaderGenerator.cc.

## ◆ addLayout()

void ACG::ShaderGenerator::addLayout | ( | QString | _layout | ) |

Add a layout directive.

Example:

layout(vertices = 3) out;

Definition at line 522 of file ShaderGenerator.cc.

## ◆ addMacros()

void ACG::ShaderGenerator::addMacros | ( | const QStringList & | _macros | ) |

Add a list of preprocessor macros.

Definition at line 481 of file ShaderGenerator.cc.

## ◆ addOutput() [1/2]

void ACG::ShaderGenerator::addOutput | ( | const QString & | _output | ) |

Add one GLSL output specifier.

Stores string pointer only Example:

out vec4 inPosition;

Definition at line 464 of file ShaderGenerator.cc.

## ◆ addOutput() [2/2]

void ACG::ShaderGenerator::addOutput | ( | const QString & | _type,
|  | const QString & | _varname
| ) |  |
| inline

Add one GLSL output specifier.

Stores string pointer only Example:

out vec4 inPosition;

Definition at line 659 of file ShaderGenerator.hh.

## ◆ addRawIOBlock()

void ACG::ShaderGenerator::addRawIOBlock | ( | QStringList | _codeBlock | ) |
| inline

Add a raw glsl IO code block.

This code block is inserted between the generated IO block and the main function.

Example:

in vec3 someInput;
out vec3 outSomeOutput;
uniform vec3 paramA;
#define USE_METHOD_X
#include "imports.h"
..

Definition at line 724 of file ShaderGenerator.hh.

## ◆ addStringToList()

void ACG::ShaderGenerator::addStringToList | ( | QString | _str,
|  | QStringList * | _list,
|  | QString | _prefix = `""`,
|  | QString | _postfix = `""`
| ) |  |
| private

aborts if string already present prefix, postfix functionality is very basic: only checks for occurrence and disregards location

Definition at line 433 of file ShaderGenerator.cc.

## ◆ addUniform()

void ACG::ShaderGenerator::addUniform | ( | QString | _uniform,
|  | QString | _comment = `""`
| ) |  |

Add one GLSL uniform specifier.

Stores string pointer only Example:

uniform sampler2D sampAmbient;

Definition at line 528 of file ShaderGenerator.cc.

## ◆ buildShaderCode()

void ACG::ShaderGenerator::buildShaderCode | ( | QStringList * | _pMainCode,
|  | const QStringList & | _defaultLightingFunctions
| ) |  |

Shader assembly function.

Also scans shader code for references to default lighting functions LitPointLight(), LitDirLight(), LitSpotLight() and eventually adds these to the shader.

Definition at line 554 of file ShaderGenerator.cc.

## ◆ defineIOAbstraction()

void ACG::ShaderGenerator::defineIOAbstraction | ( | const DefaultIODesc * | _iodesc,
|  | bool | _vs,
|  | bool | _fs
| ) |  |

Define abstract IO names via shader defines.

Default shader inputs and outputs can be conveniently accessed via SG_INPUT_X and SG_OUTPUT_X defines without having to worry about the combinatoric problem of shader stages. For example, in a fragment-shader view-space normals can always be accessed via SG_INPUT_NORMALVS, regardless whether there is a geometry shader or not.

Parameters

  _iodesc | shader IO descriptor
  _vs | IO abstraction for vertex shader
  _fs | IO abstraction for fragment shader

Definition at line 291 of file ShaderGenerator.cc.

## ◆ getInputName()

QString ACG::ShaderGenerator::getInputName | ( | int | _id | ) | const

get variable name of input

Parameters

  _id | zero based index of input

Definition at line 778 of file ShaderGenerator.cc.

## ◆ getIOMapName()

QString ACG::ShaderGenerator::getIOMapName | ( | int | _inId | ) | const

get corresponding output name of an input id

Parameters

  _inId | zero-based index of input id

Returns
  matching output name

Definition at line 796 of file ShaderGenerator.cc.

## ◆ getOutputName()

QString ACG::ShaderGenerator::getOutputName | ( | int | _id | ) | const

get variable name of output

Parameters

  _id | zero based index of output

Definition at line 755 of file ShaderGenerator.cc.

## ◆ hasDefine()

bool ACG::ShaderGenerator::hasDefine | ( | QString | _define | ) | const

Check for define.

Example:

hasDefine("#define SG_REQUEST_NORMAL")

Definition at line 493 of file ShaderGenerator.cc.

## ◆ initDefaultUniforms()

void ACG::ShaderGenerator::initDefaultUniforms | ( |  | ) |

Adds frequently used uniform parameters.

Adds frequently used uniform parameters like:

- world, view, projection matrices
- cam pos, view dir
- per object material names: g_cDiffuse, g_cAmbient...

Definition at line 386 of file ShaderGenerator.cc.

## ◆ initVertexShaderIO()

void ACG::ShaderGenerator::initVertexShaderIO | ( | const ShaderGenDesc * | _desc,
|  | const DefaultIODesc * | _iodesc
| ) |  |

Adds fitting vertex shader io for a given description.

TODO Setup for multiple texture coordinates as input

Definition at line 142 of file ShaderGenerator.cc.

## ◆ matchInputs()

void ACG::ShaderGenerator::matchInputs | ( | const ShaderGenerator * | _previousShaderStage,
|  | bool | _passToNextStage,
|  | QString | _inputPrefix = `"outVertex"`,
|  | QString | _outputPrefix = `"outGeometry"`
| ) |  |

Perform name matching of outputs and inputs between two shader stages.

IO of this shader (for instance fragment-shader) and its previous shader (for instance vertex shader) require matching names. Example: The vertex shader has an output "out vec3 outVertexNormal", then this function simply adds the input "in vec3 outVertexNormal" to the current shader (either a geometry or fragment shader). If this is a geometry shader, _passToNextStage should be set to true so that "out vec3 outGeometryNormal" is also added to the outputs.

Parameters

  _previousShaderStage | shader of the previous stage, which should have all outputs setup already
  _passToNextStage | all outputs of the previous shader stage are passed to the next stage (should be false for fragment shader for instance)
  _inputPrefix | name prefix of inputs to this shader (only necessary if _passToNextStage is true)
  _outputPrefix | name prefix of outputs of this shader (only necessary if _passToNextStage is true)

Definition at line 684 of file ShaderGenerator.cc.

## ◆ saveToFile()

void ACG::ShaderGenerator::saveToFile | ( | const char * | _fileName | ) |

Save generated shader code to text file.

Parameters

  _fileName | Where to save

Definition at line 659 of file ShaderGenerator.cc.

The documentation for this class was generated from the following files:

- OpenFlipper/libs_required/ACG/GL/ShaderGenerator.hh
- OpenFlipper/libs_required/ACG/GL/ShaderGenerator.cc