Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Toonz Shader Fxs Manual
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
==========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 1. Introduction
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toonz 7.1 allows users to write new Fxs using GLSL (the
Toshihiro Shimizu 890ddd
OpenGL Shading Language).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Shader Fx interfaces are read once at Toonz's startup,
Toshihiro Shimizu 890ddd
but the underlying fx algorithm can be modified in
Toshihiro Shimizu 890ddd
real time to ease the fx creation process.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Users reading these notes for the first time may want to
Toshihiro Shimizu 890ddd
refer to the official GLSL guide at:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  http://www.opengl.org/documentation/glsl/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Up-and-running examples of GLSL (fragment) shader programs
Toshihiro Shimizu 890ddd
can be found at the GLSL sanbox gallery, from which some of
Toshihiro Shimizu 890ddd
the provided examples are adapted from (requires a
Toshihiro Shimizu 890ddd
WebGL-compatible web browser, such as Firefox or Google
Toshihiro Shimizu 890ddd
Chrome):
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  http://glsl.heroku.com/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Further examples can be found at the beautiful gallery at:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  https://www.shadertoy.com/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
==========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 2. Requirements
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The most recent version of your graphics drivers, as well
Toshihiro Shimizu 890ddd
as a fairly recent graphics card.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Specifically, graphics drivers must support OpenGL 2.1,
Toshihiro Shimizu 890ddd
Transform Feedback and Pixel Buffers (either as a built-in
Toshihiro Shimizu 890ddd
feature or through extensions).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
==========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 3. Limitations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Shader fxs are rendered on the GPU, meaning that they are
Toshihiro Shimizu 890ddd
typically executed in a massively parallel fashion - ie fast.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
However, since most systems only adopt one GPU, only one
Toshihiro Shimizu 890ddd
Shader fx is allowed to be rendered at the same time.
Toshihiro Shimizu 890ddd
This means that Shader Fxs do not take advantage of multiple
Toshihiro Shimizu 890ddd
rendering threads in a Toonz rendering process like common
Toshihiro Shimizu 890ddd
CPU-based fxs do.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Shader Fx are intended to apply a fragment shader on the
Toshihiro Shimizu 890ddd
output surface for the fx. In other words, each output pixel
Toshihiro Shimizu 890ddd
is processed separately using the supplied fragment shader
Toshihiro Shimizu 890ddd
program.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
This prevents the implementation of more complex output
Toshihiro Shimizu 890ddd
patterns that span multiple pixels at the same time.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Furthermore, there is no way to specify intermediate buffer
Toshihiro Shimizu 890ddd
objects to read or write data to - which is often a common
Toshihiro Shimizu 890ddd
need when writing fxs.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
==========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 3. Implementing a Shader Fx
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
In order to implement a shader fx it's currently necessary
Toshihiro Shimizu 890ddd
to either create or edit the following files:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  a. <Toonz Stuff Path>/config/current.txt
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	This file hosts the associations between fxs and
Toshihiro Shimizu 890ddd
	their parameters and the names displayed in the GUI
Toshihiro Shimizu 890ddd
	(which are not locale-dependent).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  b. <Toonz Stuff Path>/profiles/layouts/fxs/fxs.lst
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	The list of fxs as displayed in the right-click
Toshihiro Shimizu 890ddd
	contextual menus like "Add Fx" or "Insert Fx"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  c. <Toonz Stuff Path>/profiles/layouts/fxs/<Your Shader Fx Name>.xml
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Parameters tabbing in the Fx Parameters Editor
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  d. <Toonz Library Path>/shaders/<Your Shader Fx Name>.xml
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	The Shader Fx interface.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  e. The actual shader program files
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Please, observe that the paths and names outside brackets
Toshihiro Shimizu 890ddd
are mandatory.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Apart from point (d) and (e) discussed separately, it is best
Toshihiro Shimizu 890ddd
to locate existing entries and emulate their behavior.
Toshihiro Shimizu 890ddd
You can typically find related entries by searching "Shader"
Toshihiro Shimizu 890ddd
in each file.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
==========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 4. The Shader Interface File
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The Shader Fx Interface file at (3.d) is an xml document that
Toshihiro Shimizu 890ddd
defines the main properties of the fx.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Specifically:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  a. Shader program files to be compiled at run-time
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  b. Input ports for the fx
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  c. Parameters
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  d. Restrictions to the class of world/output coordinates
Toshihiro Shimizu 890ddd
     transforms handled by the fx
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The file is read once when Toonz starts, so any modification
Toshihiro Shimizu 890ddd
will not be recognized until Toonz is restarted.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The complete recognized file structure is as follows:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
<MainProgram>                       // (4.a) The applied fragment shader
Toshihiro Shimizu 890ddd
  <Name>
Toshihiro Shimizu 890ddd
    SHADER_myShaderName             // Internal name of the fx (mandatory, a simple app-unique literal id)
Toshihiro Shimizu 890ddd
  </Name>
Toshihiro Shimizu 890ddd
  <ProgramFile>
Toshihiro Shimizu 890ddd
    "programs/myShader.frag"        // The shader program file (3.e), relative to the
Toshihiro Shimizu 890ddd
  </ProgramFile>                    // path of the interface file.
Toshihiro Shimizu 890ddd
</MainProgram>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
<InputPorts>                        // (4.b) - Only a *fixed* number of ports allowed
Toshihiro Shimizu 890ddd
  <InputPort>                       // A first port
Toshihiro Shimizu 890ddd
    "Source"                        // The displayed port name
Toshihiro Shimizu 890ddd
  </InputPort>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  <InputPort>                       // Second port
Toshihiro Shimizu 890ddd
    "Control"
Toshihiro Shimizu 890ddd
  </InputPort>
Toshihiro Shimizu 890ddd
  
Toshihiro Shimizu 890ddd
  <PortsProgram>                    // (4.a) Vertex shader used to acquire the geometry of
Toshihiro Shimizu 890ddd
    <Name>                          // input images. See (5.b).
Toshihiro Shimizu 890ddd
      SHADER_myShader_ports         // The unique id for the vertex shader program (mandatory)
Toshihiro Shimizu 890ddd
    </Name>
Toshihiro Shimizu 890ddd
    <ProgramFile>
Toshihiro Shimizu 890ddd
      "programs/myShader_ports.vert"
Toshihiro Shimizu 890ddd
    </ProgramFile>
Toshihiro Shimizu 890ddd
  </PortsProgram>
Toshihiro Shimizu 890ddd
</InputPorts>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
<BBoxProgram>                       // (4.a) Vertex shader used to calculate the fx's bbox.
Toshihiro Shimizu 890ddd
  <Name>                            //  See (5.c).
Toshihiro Shimizu 890ddd
    SHADER_myShader_bbox
Toshihiro Shimizu 890ddd
  </Name>
Toshihiro Shimizu 890ddd
  <ProgramFile>
Toshihiro Shimizu 890ddd
    "programs/myShader_bbox.vert"
Toshihiro Shimizu 890ddd
  </ProgramFile>
Toshihiro Shimizu 890ddd
</BBoxProgram>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
<HandledWorldTransforms>            // (4.d) Optional, see (5.a)
Toshihiro Shimizu 890ddd
  isotropic                         // May be either 'any' (default) or 'isotropic'.
Toshihiro Shimizu 890ddd
</HandledWorldTransforms>           // Isotropic transforms exclude shears and non-uniform scales.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
<Parameters>                        // (4.c)
Toshihiro Shimizu 890ddd
  <Parameter>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    float radius                    // Parameter declaration
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    <Default>                       // Additional Paramater attributes (can be omitted)
Toshihiro Shimizu 890ddd
      10                            // The parameter default
Toshihiro Shimizu 890ddd
    </Default>
Toshihiro Shimizu 890ddd
    <Range>
Toshihiro Shimizu 890ddd
      0 20                          // The parameter range
Toshihiro Shimizu 890ddd
    </Range>
Toshihiro Shimizu 890ddd
    <Concept>
Toshihiro Shimizu 890ddd
      length                        // The parameter concept type - or, how it is represented
Toshihiro Shimizu 890ddd
    </Concept>                      // by the Toonz GUI
Toshihiro Shimizu 890ddd
  </Parameter>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  <Parameter>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    float angle
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    <Concept>
Toshihiro Shimizu 890ddd
      angle_ui                      // Concepts of type <concept type>_ui are editable in
Toshihiro Shimizu 890ddd
      <Name>                        // camera stand
Toshihiro Shimizu 890ddd
        "My Angle"
Toshihiro Shimizu 890ddd
      </Name>
Toshihiro Shimizu 890ddd
    </Concept>
Toshihiro Shimizu 890ddd
  </Parameter>
Toshihiro Shimizu 890ddd
</Parameters>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
<Concept>                           // Composite parameter concepts can be formed by 2 or
Toshihiro Shimizu 890ddd
                                    // more parameters
Toshihiro Shimizu 890ddd
  polar_ui
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  <Name>
Toshihiro Shimizu 890ddd
    "My Polar Coordinates"
Toshihiro Shimizu 890ddd
  </Name>
Toshihiro Shimizu 890ddd
  <Parameter>                       // List of involved parameters
Toshihiro Shimizu 890ddd
    radius
Toshihiro Shimizu 890ddd
  </Parameter>
Toshihiro Shimizu 890ddd
  <Parameter>
Toshihiro Shimizu 890ddd
    angle
Toshihiro Shimizu 890ddd
  </Parameter>
Toshihiro Shimizu 890ddd
</Concept>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
4.1. Parameter Declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Parameters are introduced by a declaration typically matching
Toshihiro Shimizu 890ddd
the corresponding GLSL variable declaration.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The complete recognized list of supported parameter types is:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  bool, float, vec2, int, ivec2, rgb, rgba
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The 'rgb' and 'rgba' types map to GLSL 'vec3' and 'vec4'
Toshihiro Shimizu 890ddd
variables respectively, but are displayed with the appropriate
Toshihiro Shimizu 890ddd
color editors by Toonz - plus, the range of their components
Toshihiro Shimizu 890ddd
automatically maps from [0, 255] in Toonz and the Shader
Toshihiro Shimizu 890ddd
Interface file to [0.0, 1.0] in the corresponding shader program
Toshihiro Shimizu 890ddd
files.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
4.2. Parameter Concepts
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Parameter 'concepts' are additional parameter properties that
Toshihiro Shimizu 890ddd
regard the way Toonz represents a certain parameter type.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
For example, a 'float' variable type may either indicate
Toshihiro Shimizu 890ddd
an angle, the length of a segment, a percentage value,
Toshihiro Shimizu 890ddd
and more.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Fx writers may want to explicitly specify a parameter concept
Toshihiro Shimizu 890ddd
for the following reasons:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  a. Impose a measure to the parameter (e.g. degress, inches, %)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  b. Make the parameter editable in camera-stand
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The complete list of supported parameter concepts is the following:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  percent            - Displayed with the percentage '%' unit
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  length             - Displayed in length units (inches, mm, cm, etc..)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  angle              - Displayed in angular units 'ยบ'
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  point              - A vec2 displayed in length units
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  radius_ui          - Like length, displaying a radius in camstand. May compose with a point (the center)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  width_ui           - Like length, displaying a vertical line width. May compose with the line's angle.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  angle_ui           - Like angle, displaying it in camstand
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  point_ui           - Like point, in camstand
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  xy_ui              - Composes two float types in a point
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  vector_ui          - Composes two float types in an 'arrow'-like vector
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  polar_ui           - Like vector_ui, from a length and an angle
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  size_ui            - Displays a square indicating a size. May compose width and height in a rect.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  quad_ui            - Composes 4 points in a quadrilateral
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  rect_ui            - Composes width, height, and the optional center point in a rect
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
==========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 5. Shader program files
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
A shader program file is a simple text file containing the
Toshihiro Shimizu 890ddd
actual algorithms of a shader fx.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
In the current implementation of Toonz Shader Fxs, there are
Toshihiro Shimizu 890ddd
3 possible shader program files that need to be specified:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  a. The main fragment shader program, responsible of
Toshihiro Shimizu 890ddd
     executing the code that actually renders the fx
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  b. An optional vertex shader program to calculate the 
Toshihiro Shimizu 890ddd
     geometries of contents required from input ports
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  c. An optional vertex shader program to calculate the
Toshihiro Shimizu 890ddd
     bounding box of the fx output
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 5.a. The 'MainProgram' Fragment Shader
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The main program is in practice a standard GLSL fragment
Toshihiro Shimizu 890ddd
shader - however, Toonz will provide it a set of additional
Toshihiro Shimizu 890ddd
uniform input variables that must be addressed to correctly
Toshihiro Shimizu 890ddd
compute the desired output.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The complete list of additional variables always supplied
Toshihiro Shimizu 890ddd
by Toonz is:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  uniform mat3    worldToOutput;
Toshihiro Shimizu 890ddd
  uniform mat3    outputToWorld;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
These matrix variables describe the affine transforms mapping
Toshihiro Shimizu 890ddd
output coordinates to Toonz's world coordinates, and vice-versa.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
They include an additional coordinate as an OpenGL version-portable
Toshihiro Shimizu 890ddd
way to perform translations by natural multiplication - transforming
Toshihiro Shimizu 890ddd
a point is then done like:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  vec2 worldPoint = (outputToWorld * vec3(outPoint, 1.0)).xy
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Fx parameters are typically intended in world coordinates,
Toshihiro Shimizu 890ddd
and should be adjusted through these transforms - for example,
Toshihiro Shimizu 890ddd
a camstand-displayed radius value must be multiplied by the
Toshihiro Shimizu 890ddd
'worldToOutput' scale factors in order to get the corresponding
Toshihiro Shimizu 890ddd
value in output coordinates.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
World/Output transforms may be restricted to a specific sub-class
Toshihiro Shimizu 890ddd
of affine transforms by specifying so in the Shader Interface File.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Restricting to isotropic transforms may be useful to simplify
Toshihiro Shimizu 890ddd
cases where angular values are taken into account, since this
Toshihiro Shimizu 890ddd
transforms class preserves angles by allowing only uniform scales,
Toshihiro Shimizu 890ddd
rotations and translations. Non-uniform scales and shears are
Toshihiro Shimizu 890ddd
later applied by Toonz on the produced fx output if necessary.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
In case input ports have been specified, we also have:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  uniform sampler2D inputImage[n];
Toshihiro Shimizu 890ddd
  uniform mat3      outputToInput[n];
Toshihiro Shimizu 890ddd
  uniform mat3      inputToOutput[n];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The sampler variables correspond to the input content to the
Toshihiro Shimizu 890ddd
fx. The matrix variables are the reference transforms from
Toshihiro Shimizu 890ddd
output to input variables, and vice-versa.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Additional uniform variables corresponding to fx parameters
Toshihiro Shimizu 890ddd
will also be supplied by Toonz. For example, if a "float radius"
Toshihiro Shimizu 890ddd
parameter was specified, a corresponding
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  uniform float radius;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
input variable will be provided to the program.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
WARNING: Toonz requires that *output* colors must be 
Toshihiro Shimizu 890ddd
         'premultiplied' - that is, common RGB components
Toshihiro Shimizu 890ddd
         (in the range [0, 1]) must be stored multiplied
Toshihiro Shimizu 890ddd
         by their alpha component.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 5.b. The optional 'PortsProgram' Vertex Shader
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The shader program (b) is required in case an fx specifies
Toshihiro Shimizu 890ddd
input ports, AND it needs to calculate some input content
Toshihiro Shimizu 890ddd
in a different region than the required output.
Toshihiro Shimizu 890ddd
It can be neglected otherwise.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
For example, a blur fx requires that input contents outside
Toshihiro Shimizu 890ddd
the required output rectangle are 'blurred in' it.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The 'PortsProgram' vertex shader is a one-shot shader
Toshihiro Shimizu 890ddd
run by Toonz on a single dummy vertex - which uses
Toshihiro Shimizu 890ddd
OpenGL 3.0's "Transform Feedback" extension to return a
Toshihiro Shimizu 890ddd
set of predefined 'varying' output variables
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The complete set of variables supplied by Toonz and required
Toshihiro Shimizu 890ddd
in output by the program is:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  uniform mat3    worldToOutput;
Toshihiro Shimizu 890ddd
  uniform mat3    outputToWorld;
Toshihiro Shimizu 890ddd
  uniform vec4    outputRect;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  varying vec4    inputRect[portsCount];
Toshihiro Shimizu 890ddd
  varying vec4    worldToInput[portsCount];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The transforms are intended in the same way as (5.a).
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The outputRect and inputRect[] variables store the
Toshihiro Shimizu 890ddd
(left, bottom, right, top) rect components in output
Toshihiro Shimizu 890ddd
and input coordinates respectively.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Parameter input variables are obviously also supplied.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
WARNING: *All* the required output variables must be
Toshihiro Shimizu 890ddd
	 declared AND filled with values.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
         There is no recognized default for them, and the
Toshihiro Shimizu 890ddd
         fx will (silently) fail to render if some are not
Toshihiro Shimizu 890ddd
         assigned.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
 5.c. The optional 'BBoxProgram' Vertex Shader
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Some fx may be able to restrict their opaque renderable
Toshihiro Shimizu 890ddd
area inside a rect.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
For example, blurring an image will 'blur out' the image
Toshihiro Shimizu 890ddd
content by the specified blur radius. Beyond that, the fx
Toshihiro Shimizu 890ddd
will render full transparent pixels. Thus, the bounding
Toshihiro Shimizu 890ddd
box of the fx in this case will be calculated as the
Toshihiro Shimizu 890ddd
input bounding box, enlarged by the blur radius.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The default output bounding box is assumed to be infinite;
Toshihiro Shimizu 890ddd
if that is the case, the BBoxProgram can be omitted.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Fx writers may want to supply an explicit program to
Toshihiro Shimizu 890ddd
calculate the bounding box of the fx, given its input
Toshihiro Shimizu 890ddd
bounding boxes. This is be useful in Toonz's rendering
Toshihiro Shimizu 890ddd
pipeline because the software is then allowed to
Toshihiro Shimizu 890ddd
restrict memory allocation (and fxs calculations)
Toshihiro Shimizu 890ddd
for the output image to said output bounding box, resulting
Toshihiro Shimizu 890ddd
in less memory consumption and increased speed.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The complete set of variables supplied by Toonz and required
Toshihiro Shimizu 890ddd
in output by the program is:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  uniform vec4 infiniteRect;
Toshihiro Shimizu 890ddd
  uniform vec4 inputBBox[portsCount];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  varying vec4 outputBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
The infiniteRect variable should be used to identify both
Toshihiro Shimizu 890ddd
input and output infinite bboxes.
Toshihiro Shimizu 890ddd