Color and alpha blending, depth, stencil and culling are controlled by the
GraphicConfig
node.
node.gl
is aligned with the traditional blending mode concepts from graphics
APIs. For example, color and alpha blending involves source and destination
factors for color channels or alpha, and a blending operation (addition,
subtraction, etc). This document will assume you are familiar with these
concepts.
For color and alpha blending, you will be particularly interested in the
GraphicConfig.blend*
parameters. Similarly, depth and stencil configuration
can be respectively found in GraphicConfig
parameters prefixed by depth
and
stencil
.
By default, node.gl
aligns its defaults with the sane ones from OpenGL:
- Blending: disabled
- Blending source factor:
1
- Blending destination factor:
0
- Blending source factor alpha:
1
- Blending destination factor alpha:
0
- Blending operation: addition
- Blending operation alpha: addition
- Color write mask: red, green, blue, alpha
- Depth test: disabled
- Depth write mask:
1
- Depth Function: less than
- Stencil test: disabled
- Stencil write mask:
0xff
- Stencil function: always
- Stencil reference:
0
- Stencil read mask:
0xff
- Stencil fail: keep
- Stencil depth fail: keep
- Stencil depth pass: keep
- Cull mode: none
In a graph, a GraphicConfig
will inherit the parameters from its parent(s),
or from the previously mentioned defaults if it has none. Every parameter that
is not set (or set to None
/NULL
) will be inherited from its
ancestor(s).
Sibling branches do not share graphic state except from their common ancestor: the parenthood is not expressed by the tree visiting sequence at draw time but by the graph structure itself. Said differently, when the drawing cursor goes out of a branch (because it has been drawn), it will reset the graphic state to what it was before entering that branch, and then move into the sibling branch.
While sibling branches do not share the graphic state, it is important to keep in mind that they do share the same color buffer: the current blending destination represents what was drawn by previous sibling branches, or the initial frame buffer color if nothing was rendered yet.
While the inheritance mechanism makes sense for categories of settings, it is a source of confusion within a given scope. For example, while it makes sense to inherit from the stencil and depth parameters when changing the color blending (because they are conceptually independent from each other), it doesn't make much sense to inherit from the alpha blending factors from the ancestors when setting the color blending factors.
Some solutions involve splitting GraphicConfig
into several nodes, or have an
internal mechanism such as "if at least one setting of a given group is set,
reset to the defaults the unset settings of that group".
Even if explicitly set to None
/NULL
, the parameters will not be reset
to their default values but still inherited from the parent(s). There are
multiple ways we could address this issue:
- implementing the settings grouping mechanism (as mentioned in the previous section), which workarounds the issue by removing the need for a reset
- adding specific
reset
constants toGraphicConfig
parameters - introducing a dedicated node with the reset-to-defaults purpose
In some circumstances, it may be relevant to automatically reset the graphic
state in a sub-tree. The main contender here would be the RenderToTexture
node.