Skip to content

Post‐processing Effects

Zoltán Dócs edited this page Jun 21, 2026 · 2 revisions

Post-effect layers let you modify the rendered image. Multiple effects can be chained together similarly to adjustment layers in Photoshop. Each layer receives the output of the previous one, applied top-to-bottom in the order you define in the Post Fx panel. Possible use-cases: color-grade, distort, blur, add noise, etc. You can even write your own custom effects as GLSL shader snippets.

image

Usage

Add a post-effect layer to your fractal:

  1. Open the Post Fx panel on the right side of the main window.
  2. Click the + Add effect dropdown and select an effect from the list.
  3. The effect appears as an expandable item in the list.

Working with post-effect layers:

  • Enable/Disable: Use the checkbox next to its name. Disabled effects are skipped during rendering but remain in the list when you save and load your fractal.
  • Reorder: Use the and buttons on each effect to change its position in the chain. Effects are applied top-to-bottom, so order matters.
  • Remove: Click the button on an effect to remove it from the chain.
  • Edit parameters: Click the expander arrow (▶) on any effect to reveal its parameters. Adjust values using the sliders - changes are applied in real time.
  • You can even animate effect parameters like any other value.

Installing post-effect plugins

Similarly to how transform plugins work, you can drop IFSRenderer post-effect files (*.ifsfx) into the Library/PostEffects/ directory (you can open this with the 📂 button on the PostFx panel). Then click 🔄 to reload all plugins from disk.

Writing custom post-effect plugins

Post-effect plugins are plain text files with the .ifsfx extension, containing some markup and GLSL code snippets. The design is very similar to transform plugins:

@Name: Glow
@Version: 1.0
@Description: Adds a soft glow by blending a blurred copy

// Custom parameters that appear in the editor
@Strength: 1.0
@Size: 4

// Your GLSL fragment shader code snippet goes here.
// The sampler "input_tex" provides the input texture holding the output from the previous pass.
// vec2 "uv" holds normalized coordinates.
// vec4 "input_color" holds the color from input_tex at uv coordinates.
// int "width" and "height" uniforms hold the image dimensions in pixels.
// vec3 "getPaletteColor(index)" can be used to sample the palette loaded in the editor. Pass a float index between 0-1 as argument.
// Modify vec4 'output_color' - its final value is the output pixel.

int size = int(@Size);
vec4 blur = vec4(0.0);
for (int i = -size; i <= size; i++) {
    for (int j = -size; j <= size; j++) {
        blur += texture(input_tex, uv + vec2(float(i), float(j)) / vec2(width, height));
    }
}
blur /= float((2 * size + 1) * (2 * size + 1));

output_color = mix(input_color, input_color+blur, @Strength);

Parameters

@Name (required), @Version (required), @Description (optional) and @Use (optional) are reserved metadata fields.

Any other @FieldName: defaultValue line becomes a user-editable parameter:

  • Real (float): @Strength: 1.0 — single number
  • Vec3: @Offset: 0 0 0 — three space-separated numbers

Inside the shader, reference parameters with @FieldName. They are replaced with their corresponding values at runtime.

Includes

Functions cannot be defined in plugins. If you have a glsl library you want to use, add a glsl snippet in /Library/Includes/ folder, then add the following line to your plugin:

@Use: MyFunctions.glsl

Clone this wiki locally