Skip to content

Effects Reference ​

Exaplay's visual effects run inside the engine, on the GPU, as part of the normal render of a clip. There is no separate effects service and no extra port to open: an effect is a property of the clip, stored in the project and set through the same channels as any other clip property — the Inspector, POST /data, a TCP/UDP set: command, a cue script, or a Data Track.

Replaces the old "Effects Server API" page

Earlier versions of this page documented a Node.js "Effects Server" on http://localhost:3001 with /effects/apply, /effects/colorkey and a ws://localhost:3001/effects socket. No such service exists — it was never part of the shipped product, nothing in the UI connects to port 3001, and no firewall rule is needed for it. Use the value paths on this page instead.

The contract ​

Every clip carries two things:

ValueTypeMeaning
effect-namestringThe effect's id (see the catalogue below), or none
effect.<parameter>floatOne parameter of the selected effect

A clip has one effect at a time — the picker is a choice, not a stack. Setting effect-name to a different id replaces the current effect; setting it to none removes it.

Parameter names are the shader's own uniform names. Writing effect.<parameter> for a parameter the current effect does not have changes nothing on screen — but the value stays on the clip and is read by any later effect that uses the same name (see Shared parameter names).

Where the values live ​

effect-name and effect.* are ordinary clip values, so they are:

  • saved with the project,
  • applied on the next rendered frame (no reload),
  • fanned out to render clients on a multi-client rig like any other uid-addressed value edit (see Multi-Client Setup),
  • addressable from every control protocol.

Setting an effect ​

From the Inspector ​

Select the clip, open the Effects section and its Effect picker, choose an effect, and adjust the sliders below it. See Visual Effects.

Over HTTP ​

http
POST /data HTTP/1.1
Host: 192.168.1.5:8123
Content-Type: application/json

{
  "type": "exaObj",
  "uid": 12345678,
  "values": {
    "effect-name": "colorkey",
    "effect.key_r": 0.0,
    "effect.key_g": 1.0,
    "effect.key_b": 0.0,
    "effect.tolerance": 0.3,
    "effect.edge_softness": 0.1
  }
}

uid is the clip's UID from GET /project?req=tree. type must be exaObj — a POST /data without it answers 200 and writes nothing.

Over TCP / UDP / cue script ​

The generic set: verb addresses the same paths:

comp_main.media3.set:effect-name=blur
comp_main.media3.set:effect.blur_amount=3.5

See the TCP Command API.

From a timeline curve ​

A Data Track with the Exaplay value output can drive any of these paths, so an effect parameter can be animated along the timeline.

Shared parameter names ​

A parameter is stored as effect.<name> on the clip, without the effect's id. Several effects use the same names — intensity, amount, contrast, levels, rotation, zoom, center_x, edge_softness, softness, scale, speed, brightness and others — so a value set for one effect is still there when you switch the clip to another effect that reads the same name. Set the parameters after effect-name when you switch effects from show control.

The default in the tables below is the effect's own default — what the Inspector's reset button (the ↺ next to Change, Reset to this effect's defaults) writes. Setting effect-name alone does not apply it: a shared parameter keeps whatever value the clip already holds, and on a fresh clip that is the default of another effect that uses the same name. For example effect.amount starts at 0.5 (Vignette's default), so a Chromatic Aberration applied without also writing amount runs far beyond its 0–0.06 range. From show control, always write every parameter you rely on together with effect-name.

effect.intensity is the intensity parameter of Oil Painting, Scanlines, Aurora and Fire — there is no general wet/dry mix and no effect region.

Effect catalogue ​

56 effects, plus none. Ranges below are the Inspector's slider limits. Values written over the API are passed to the shader unclamped — keep them inside the range yourself. Parameter names are mostly lowercase with underscores; a few are camelCase (fovX, fovY, fisheyeFOV) and must be written exactly so.

Not every effect is offered in the Inspector's picker. These ids are still rendered by the engine and can still be set over the API, but the picker no longer lists them (a clip that already uses one still shows it): black_white, invert, sepia, vibrance, exposure, gamma, color_balance, shadows_highlights, camera_intrinsic, pixelate, edge, oil_painting, toon, kaleidoscope, motion_blur, color_curves, led_moire, add_color, and the four Generative Domemaster fills. The picker groups the rest as Color & Tone, Blur & Sharpen, Stylize, Keying, Projection & 360°, LED & Virtual Production and People & Performers — the headings below follow the engine's own categories.

Keying ​

Effect idParameters (range, default)
colorkeykey_r (0–1, 0), key_g (0–1, 1), key_b (0–1, 0), tolerance (0–1, 0.3), edge_softness (0–1, 0.1), luma_tolerance (0–1, 0.35), spill (0–1, 0.5), spill_balance (0–1, 0.5), key_smooth (0–0.5 s, 0)
luminance_keythreshold_low (0–1, 0), threshold_high (0–1, 0.3), softness (0–1, 0.1), invert (0–1, 0), key_smooth (0–0.5 s, 0)

The key colour is three separate 0–1 floats, not a hex string. Green screen (#00FF00) is key_r 0, key_g 1, key_b 0 — which is the default.

key_smooth (Edge Calm) smooths the matte over time where it only jitters; 0 (the default) is off.

Tone & Exposure ​

Effect idParameters (range, default)
levelsblack_point (0–1, 0), white_point (0–1, 1), gamma (0.5–2, 1)
brightness_contrastbrightness (−1–1, 0), contrast (0–2, 1)
exposureexposure (−2–2, 0)
gammagamma_value (0.5–2.5, 1)
color_balanceshadows_/midtones_/highlights_ × cyan_red, magenta_green, yellow_blue (each −1–1, 0)
shadows_highlightsshadows (−1–1, 0), highlights (−1–1, 0)

Color Management ​

Effect idParameters (range, default)
black_whitecontrast (0.5–2, 1)
sepiatone_strength (0–2, 1), saturation (0–2, 1)
invertamount (0–1, 1)
hue_saturationhue (−180–180, 0), saturation (−1–2, 1), lightness (−1–1, 0)
color_temperaturetemperature (−1–1, 0) — shown as Warm / Cool Tint: an additive red/blue offset, not a Kelvin white balance. For that use the clip's Color Correction section.

Color Grading ​

Effect idParameters (range, default)
add_coloradd_r, add_g, add_b (each −1–1, 0)
multiply_colormul_r, mul_g, mul_b (each 0–2, 1)
vibrancevibrance (−1–2, 0)
color_curvescurve_amount (−1–1, 0) — shown as S-Curve Contrast: one strength value toward a fixed S-curve, not an editable curve.

Blur & Sharpening ​

Effect idParameters (range, default)
blurblur_amount (0.5–5, 2)
sharpensharpness (0.5–3, 1.5) — 1 leaves the picture untouched, above 1 sharpens, below 1 softens; the average brightness stays the same.
motion_blurblur_angle (0–360, 0), blur_strength (0–1, 0)

Artistic Effects ​

Effect idParameters (range, default)
pixelatepixel_size (1–50, 8)
edgeedge_strength (0–2, 1), invert_edges (on/off, off)
oil_paintingbrush_size (1–10, 3), intensity (0–1, 0.5)
toonlevels (2–8, 4), edge_threshold (0–1, 0.3), edge_strength (0–1, 1)
kaleidoscopesegments (2–32, 6), rotation (0–360, 0), zoom (0.1–5, 1), center_x/center_y (0–1, 0.5)

Stylize ​

Effect idParameters (range, default)
chromatic_aberrationamount (0–0.06, 0.012)
vignetteamount (0–1, 0.5), radius (0.2–1.5, 0.8), softness (0.05–1, 0.5)
posterizelevels (2–32, 6)
halftonescale (20–300, 90), softness (0–1, 0.4)
scanlinescount (100–1080, 480), intensity (0–1, 0.4)

Distortion & Projection ​

Effect idParameters (range, default)
domeazimuth (−360–360, 90), elevation (−179–179, 50), rotation (0–90, 0), fovY (0–360, 180)
fisheye180_domeazimuth (−360–360, 0), elevation (−179–179, 0), rotation (−180–180, 0), lens_rotation (−180–180, 0), zoom (0.5–2, 1), center_x/center_y (0–1, 0.5), edge_softness (0–0.2, 0.01)
fish2domeazimuth (−720–720, 0), elevation (−360–360, −90), rotation (−360–360, 0), fovY (1–360, 230), fisheyeFOV (1–360, 180), center_x/center_y (0–1, 0.5), circle_size (0.05–4, 1)
dome_flat2gridratiox (1–100, 16), ratioy (1–100, 9), azimuth (0–360, 180), elevation (0–90, 55), fov (1–180, 45)
rectangle_to_domedome_radius (0–10000, 300), dome_aperture (0–360, 180), virtual_screen_azimuth (−180–180, 0), virtual_screen_elevation (−90–90, 35), virtual_screen_width (0–10000, 355), virtual_screen_height (0–10000, 200), dome_tilt (0–180, 21)
dome_plane2fisheyeazimuth (0–360, 0), altitude (0–90, 90), zoom (1–350, 100), fov (1–360, 180), camera_x/camera_y (−100–100, 0)
lens_distortionbarrel_amount (−1–1, 0), vignette (0–1, 0)
camera_intrinsicfocal_length (0.5–3, 1), principal_x/principal_y (−0.5–0.5, 0), radial_k1/radial_k2 (−1–1, 0), tangential_p1/tangential_p2 (−0.5–0.5, 0), skew (−0.5–0.5, 0)
equirect_flatpan (−360–360, 0), tilt (−90–90, 0), roll (−180–180, 0), fovX (10–170, 90), aspect (0.1–10, 1.7778) — a flat window into 2:1 equirectangular 360° footage. The picker lists it under Projection & 360°

Putting a fisheye on a dome: which of the two ​

fisheye180_dome assumes the source was shot through a 180° lens that fills the frame. Reach for fish2dome when it was not — a fisheye livestream whose circle sits off-centre or cropped, or a Giant Screen / Omnimax print, whose lens is not 180° and which the other effect therefore stretches.

Two groups of parameters carry that:

  • fisheyeFOV is the angle the input lens covered. Set it to the lens's own figure; leaving it at 180 on a narrower lens is exactly the stretch.
  • center_x, center_y, circle_size describe where the image circle sits in the file. The centre is a fraction of the image and the diameter a multiple of its shorter side, so the numbers survive a re-encode at another resolution and mean the same thing on a client running a proxy. From pixels measured in an image editor: center_x = centre_px_x / image_width, center_y = centre_px_y / image_height, circle_size = diameter_px / min(image_width, image_height). The defaults describe a centred circle filling the shorter side, so an ordinary full-frame circular fisheye needs no calibration.

fovY is the output dome's coverage — 180 for a hemisphere, 230 for a dome that carries on past the springline. Orientation is azimuth (heading), elevation (tilt, −90 puts the lens axis on the apex) and rotation (roll about the lens axis). Directions the lens never recorded are left transparent rather than smeared, so a narrow lens on a wide dome shows an empty rim.

The mapping is equidistant (radius ∝ angle off the lens axis), which is what Giant Screen and scientific fisheye lenses are calibrated to.

fish2dome was written by Tom Kwasnitschka (GEOMAR Helmholtz Centre for Ocean Research Kiel) and shared for Exaplay.

Generative Domemaster ​

Procedural fills, animated from the engine clock — they replace the clip's image rather than processing it. The UI no longer offers them as effects: the same fills are built-in generators ($[realtime]/dome-hyperspace, dome-nebula, dome-fluid, dome-fire). The effect ids stay valid, so a project that uses one keeps playing it.

Effect idParameters (range, default)
dome_hyperspacespeed (0–5, 1), segments (1–24, 6), twist (−4–4, 1), hue_shift (0–1, 0), glow (0–3, 1.2), brightness (0–3, 1), edge_softness (0–0.2, 0.02)
dome_auroraspeed (0–3, 0.6), scale (0.5–6, 2.5), hue_shift (0–1, 0.55), intensity (0–3, 1.3), star_density (0–1, 0.5), brightness (0–3, 1), edge_softness (0–0.2, 0.02)
dome_fluidspeed (0–3, 0.7), scale (0.5–6, 2.2), swirl (0–3, 1.1), hue_shift (0–1, 0.15), iridescence (0–2, 0.9), brightness (0–3, 1), edge_softness (0–0.2, 0.02)
dome_firespeed (0–4, 1.2), scale (0.5–6, 2.6), turbulence (0–2, 1), flame_height (0–2, 0.8), intensity (0–3, 1.4), brightness (0–3, 1), edge_softness (0–0.2, 0.02)

LED & Virtual Production ​

Effect idParameters (range, default)
led_moireled_moire_strength (0–1, 0.5), led_moire_h_radius/led_moire_v_radius (0–4, 1)
led_black_liftled_black_lift (0–0.15, 0.02), led_black_gamma (0.5–2, 1), led_white_clip (0.8–1, 1)
led_pixel_gridled_grid_pitch (1–32, 4), led_grid_gap (0–0.6, 0.15), led_grid_darkness (0–1, 0.8)
led_gamut_limiterled_max_sat (0–2, 1), led_sat_rolloff (0–1, 0.3), led_skin_protect (0–1, 0)
eye_adapteye_white_r/eye_white_g/eye_white_b (0.5–2, 1), eye_adapt_degree (0–1, 0.8), eye_luminance (0.1–4, 1), eye_hunt (0–2, 0), eye_stevens (0–1, 0), eye_purkinje (0–1, 0), eye_surround (−1–1, 0), eye_chroma (0–2, 1), eye_lightness_exp (0.5–2, 1)

People & Performers ​

Live looks for a camera on people. Each finds its subject by brightness (subject_threshold: darker is background, 0 = whole picture) or by a green screen (green_screen, 0/1); the two parameters mean the same in all eight, and every other name is used by this folder only (glow_amount by both Particle Dissolve and Neon Outline, with one default), so switching between these looks never inherits a value meant for another effect. Animated from the engine clock; transparent where no subject is found.

Effect idParameters (range, default)
people_particlessubject_threshold (0–0.8, 0.12), green_screen (0/1, 0), density (30–300, 120), dissolve (0–1, 0.45), drift (0–1, 0.35), particle_size (0.2–1, 0.6), glow_amount (0–2, 1), background (0–1, 0)
people_hologramsubject_threshold, green_screen, holo_hue (0–360, 190), scan_lines (40–800, 260), flicker (0–1, 0.35), holo_glitch (0–1, 0.3), edge_glow (0–2, 1)
people_clonessubject_threshold, green_screen, copies (1–6, 4), spread (0–0.5, 0.16), sway (0–1, 0.3), hue_spread (0–1, 0.6), echo_opacity (0–1, 0.7), echo_delay (0–1.5 s, 0)
people_neonsubject_threshold, green_screen, thickness (0.5–6, 1.5), glow_amount (0–2, 1), hue_speed (0–2, 0.3), fill (0–1, 0.15), background (0–1, 0), neon_trail (0–2 s, 0)
people_codesubject_threshold, green_screen, columns (30–240, 110), code_hue (0–360, 130), rain_speed (0–3, 1), source_color (0–1, 0.3), rain_outside (0–1, 0)
people_glitchsubject_threshold, green_screen, glitch_amount (0–1, 0.5), block_size (4–60, 18), rate (1–30, 10), rgb_split (0–0.05, 0.012), datamosh (0–1, 0)
people_time_smearsubject_threshold, green_screen, smear_length (0.05–3 s, 0.5), smear_colorize (0–1, 0.8), smear_hue_speed (0–4, 1.2), smear_rise (0–0.5, 0), smear_intensity (0–2, 1), smear_background (0–1, 1)
people_motion_sparkssubject_threshold, green_screen, motion_threshold (0–0.5, 0.06), spark_length (0.05–3 s, 0.6), spark_rise (0–1, 0.25), spark_swirl (0–1, 0.4), spark_hue (0–360, 30), spark_rainbow (0–1, 0.5), spark_density (0.05–1, 0.35), spark_intensity (0–3, 1.2), sparks_background (0–1, 1)

people_time_smear and people_motion_sparks keep state between frames (the engine's effect feedback buffer). So do echo_delay, neon_trail, datamosh and the keys' key_smooth, but only while they are above 0: at 0 the effect runs exactly as it did before they existed. The state starts empty when the clip starts, and restarts after a seek or a jump in time of more than a second.

Exaplay 3 User Documentation