Material Blend Strings

Material Blend Strings — A simple syntax and grammar for describing blending and texture combining functions.

Cogl Blend Strings

Describing GPU blending and texture combining states is rather awkward to do in a consise but also readable fashion. Cogl helps by supporting string based descriptions using a simple syntax.

Some examples

Here is an example used for blending:

"RGBA = ADD (SRC_COLOR * (SRC_COLOR[A]), DST_COLOR * (1-SRC_COLOR[A]))"

In OpenGL terms this replaces glBlendFunc[Separate] and glBlendEquation[Separate]

Actually in this case it's more verbose than the GL equivalent:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

But unless you are familiar with OpenGL or refer to its API documentation you wouldn't know that the default function used by OpenGL is GL_FUNC_ADD nor would you know that the above arguments determine what the source color and destination color will be multiplied by before being adding.

Here is an example used for texture combining:

"RGB = REPLACE (PREVIOUS)"
"A = MODULATE (PREVIOUS, TEXTURE)"

In OpenGL terms this replaces glTexEnv, and the above example is equivalent to this OpenGL code:

  glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
  glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
  glTexEnvi (GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
  glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
  glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
  glTexEnvi (GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
  glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_COLOR);
  glTexEnvi (GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
  glTexEnvi (GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_COLOR);

Here's the syntax

<statement>:
  <channel-mask>=<function-name>(<arg-list>)

  You can either use a single statement with an RGBA channel-mask or you can use
  two statements; one with an A channel-mask and the other with an RGB
  channel-mask.

<channel-mask>:
  A or RGB or RGBA

<function-name>:
  [A-Za-z_]*

<arg-list>:
  <arg>,<arg>
  or <arg>
  or ""

  I.e. functions may take 0 or more arguments

<arg>:
  <color-source>
  1 - <color-source>                : Only intended for texture combining
  <color-source> * ( <factor> )     : Only intended for blending
  0                                 : Only intended for blending

  See the blending or texture combining sections for further notes and examples.

<color-source>:
  <source-name>[<channel-mask>]
  <source-name>

  See the blending or texture combining sections for the list of source-names
  valid in each context.

  If a channel mask is not given then the channel mask of the statement
  is assumed instead.

<factor>:
  0
  1
  <color-source>
  1-<color-source>
  SRC_ALPHA_SATURATE