+
+The shader generation model is based on variable substitutions. Initially, a
+goal variable is given for each shader stage. The expression for computing
+each variable is examined for further variable definitions. When there are no
+more known variables available for substitution, the process terminates. Any
+unknown variables at this point are assumed to be provided by OpenGL.
+
+Variables can be defined in a number of scopes. The scope of a variable
+determines where its value is computed. If a variable is referenced from a
+scope that comes after the declaration scope, an interface variable is
+automatically emitted.
+
+Generated shaders are normally optimized by inlining variables with a single
+reference into the expression referencing them. This can result in expressions
+of several hundreds of characters in length, so optimizations can be disabled
+with the set_optimize() method for debugging purposes.
+
+Custom variables can be injected to the generated shaders with the custom
+member of the StandardFeatures struct. The syntax is:
+
+ <custom> := [<decl> ...]
+ <decl> := <scope> <type> <name> [= <expr>] ;
+ <scope> := uniform | attribute | vertex | fragment
+ <type> := (any GLSL type)
+ <name> := (valid identifier)
+ <expr> := (GLSL expression)
+
+The custom variables should always include at least one override for a built-in
+variable; otherwise they will be ignored as no built-in expression references
+them.