Clutter.ShaderEffect
Description: Reference for Clutter.ShaderEffect

### Class

# ClutterShaderEffect

#### Description [src]

    class Clutter.ShaderEffect : Clutter.OffscreenEffect
    {
      /* No available fields */
    }

Base class for shader effects

`ClutterShaderEffect` is a class that implements all the plumbing for creating `ClutterEffect`s using GLSL shaders.

`ClutterShaderEffect` creates an offscreen buffer and then applies the GLSL shader (after checking whether the compilation and linking were successful) to the buffer before painting it on screen.

## Implementing a ClutterShaderEffect

Creating a sub-class of `ClutterShaderEffect` requires the overriding of the `Clutter.OffscreenEffectClass.paint_target` virtual function from the `ClutterOffscreenEffect` class. It is also convenient to implement the `Clutter.ShaderEffectClass.get_static_shader_source` virtual function in case you are planning to create more than one instance of the effect.

The `Clutter.ShaderEffectClass.get_static_shader_source` function should return a copy of the shader source to use. This function is only called once per subclass of `ClutterShaderEffect` regardless of how many instances of the effect are created. The source for the shader is typically stored in a static const string which is returned from this function via g_strdup().

The `Clutter.OffscreenEffectClass.paint_target` should set the shader’s uniforms if any. This is done by calling `clutter_shader_effect_set_uniform_value()` or `clutter_shader_effect_set_uniform()`. The sub-class should then chain up to the `ClutterShaderEffect` implementation.

## Setting uniforms on a ClutterShaderEffect

The example below shows a typical implementation of the `Clutter.ShaderEffectClass.get_static_shader_source` and `Clutter.OffscreenEffectClass.paint_target` virtual functions for a `ClutterShaderEffect` subclass.

     static gchar *
     my_effect_get_static_shader_source (ClutterShaderEffect *effect)
     {
       // shader_source is set elsewhere
       return g_strdup (shader_source);
     }

     static gboolean
     my_effect_paint_target (ClutterOffscreenEffect *effect)
     {
       MyEffect *self = MY_EFFECT (effect);
       ClutterShaderEffect *shader = CLUTTER_SHADER_EFFECT (effect);
       ClutterEffectClass *parent_class;
       gfloat component_r, component_g, component_b;

       // the "tex" uniform is declared in the shader as:
       //
       //   uniform int tex;
       //
       // and it is passed a constant value of 0
       clutter_shader_effect_set_uniform (shader, "tex", G_TYPE_INT, 1, 0);

       // the "component" uniform is declared in the shader as:
       //
       //   uniform vec3 component;
       //
       // and it's defined to contain the normalized components
       // of a #CoglColor
       component_r = self->color.red   / 255.0f;
       component_g = self->color.green / 255.0f;
       component_b = self->color.blue  / 255.0f;
       clutter_shader_effect_set_uniform (shader, "component",
                                          G_TYPE_FLOAT, 3,
                                          component_r,
                                          component_g,
                                          component_b);

       // chain up to the parent's implementation
       parent_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (my_effect_parent_class);
       return parent_class->paint_target (effect);
     }

#### Hierarchy

#### Ancestors

- ClutterOffscreenEffect
- ClutterEffect
- ClutterActorMeta
- GInitiallyUnowned
- GObject

#### Constructors

###### clutter_shader_effect_new

Creates a new `ClutterShaderEffect`, to be applied to an actor using `clutter_actor_add_effect()`.

#### Instance methods

###### clutter_shader_effect_get_program

Retrieves a pointer to the program’s handle.

###### clutter_shader_effect_get_shader

Retrieves a pointer to the shader’s handle.

###### clutter_shader_effect_set_shader_source

Sets the source of the GLSL shader used by `effect`.

###### clutter_shader_effect_set_uniform

Sets a list of values as the payload for the uniform `name` inside the shader effect.

###### clutter_shader_effect_set_uniform_value

Sets `value` as the payload for the uniform `name` inside the shader effect.

##### Methods inherited from ClutterOffscreenEffect (5)

###### clutter_offscreen_effect_create_texture

Calls the `Clutter.OffscreenEffectClass.create_texture` virtual function of the `effect`.

###### clutter_offscreen_effect_get_pipeline

Retrieves the pipeline used as a render target for the offscreen buffer created by `effect`.

###### clutter_offscreen_effect_get_target_size

Retrieves the size of the offscreen buffer used by `effect` to paint the actor to which it has been applied.

###### clutter_offscreen_effect_get_texture

Retrieves the texture used as a render target for the offscreen buffer created by `effect`.

###### clutter_offscreen_effect_paint_target

Calls the `Clutter.OffscreenEffectClass.paint_target` virtual function of the `effect`.

##### Methods inherited from ClutterEffect (1)

###### clutter_effect_queue_repaint

Queues a repaint of the effect. The effect can detect when the ‘paint’ method is called as a result of this function because it will not have the `CLUTTER_EFFECT_PAINT_ACTOR_DIRTY` flag set. In that case the effect is free to assume that the actor has not changed its appearance since the last time it was painted so it doesn’t need to call `clutter_actor_continue_paint()` if it can draw a cached image. This is mostly intended for effects that are using a %CoglOffscreen to redirect the actor (such as %ClutterOffscreenEffect). In that case the effect can save a bit of rendering time by painting the cached texture without causing the entire actor to be painted.

##### Methods inherited from ClutterActorMeta (5)

###### clutter_actor_meta_get_actor

Retrieves a pointer to the `ClutterActor` that owns `meta`.

###### clutter_actor_meta_get_enabled

Retrieves whether `meta` is enabled.

###### clutter_actor_meta_get_name

Retrieves the name set using `clutter_actor_meta_set_name()`.

###### clutter_actor_meta_set_enabled

Sets whether `meta` should be enabled or not.

###### clutter_actor_meta_set_name

Sets the name of `meta`.

##### Methods inherited from GObject (43)

Please see GObject for a full list of methods.

#### Properties

###### Clutter.ShaderEffect:shader-type

The type of shader that is used by the effect. This property should be set by the constructor of `ClutterShaderEffect` sub-classes.

##### Properties inherited from ClutterActorMeta (3)

###### Clutter.ActorMeta:actor

The `ClutterActor` attached to the `ClutterActorMeta` instance.

###### Clutter.ActorMeta:enabled

Whether or not the `ClutterActorMeta` is enabled.

###### Clutter.ActorMeta:name

The unique name to access the `ClutterActorMeta`.

#### Signals

##### Signals inherited from GObject (1)

###### GObject::notify

The notify signal is emitted on an object when one of its properties has its value set through g_object_set_property(), g_object_set(), et al.

#### Class structure

    struct ClutterShaderEffectClass {
      gchar* (* get_static_shader_source) (
        ClutterShaderEffect* effect
      );

    }

The `ClutterShaderEffectClass` structure contains only private data.

###### Class members

`get_static_shader_source: gchar* (* get_static_shader_source) ( ClutterShaderEffect* effect )`

  Returns the GLSL source code to use for instances of this shader effect. Note that this function is only called once per subclass of `ClutterShaderEffect` regardless of how many instances are used. It is expected that subclasses will return a copy of a static string from this function.

#### Virtual methods

###### Clutter.ShaderEffectClass.get_static_shader_source

Returns the GLSL source code to use for instances of this shader effect. Note that this function is only called once per subclass of `ClutterShaderEffect` regardless of how many instances are used. It is expected that subclasses will return a copy of a static string from this function.