Appearance
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/OSC set: command, 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:
| Value | Type | Meaning |
|---|---|---|
effect-name | string | The effect's id (see the catalogue below), or none |
effect.<parameter> | float | One 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 (lowercase with underscores). Writing effect.<parameter> for a parameter the current effect does not have is harmless — it is simply never read.
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 /data request without it is not dispatched.
Over TCP / OSC / 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.5See 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.
Common controls
These apply on top of whichever effect is selected:
| Value | Default | Meaning |
|---|---|---|
effect.intensity | 100 | Wet/dry mix of the effect, in percent |
effect.use-region | false | Apply the effect to a sub-region only |
effect.entire-effect | true | Apply to the whole frame |
effect.x, effect.y | 0 | Region origin |
effect.w, effect.h | 100% | Region size |
effect.align | C | Region alignment |
effect.scaling | cover | Region scaling mode |
effect.flip-h, effect.flip-v | false | Flip the effect region |
effect.angle | 0 | Rotate the effect region |
Effect catalogue
46 effects in 10 categories, plus none. Ranges below are the slider limits the Inspector enforces; the same limits apply to values written over the API.
Keying
| Effect id | Parameters (range, default) |
|---|---|
colorkey | key_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) |
luminance_key | threshold_low (0–1, 0), threshold_high (0–1, 0.3), softness (0–1, 0.1), invert (0–1, 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.
Tone & Exposure
| Effect id | Parameters (range, default) |
|---|---|
levels | black_point (0–1, 0), white_point (0–1, 1), gamma (0.5–2, 1) |
brightness_contrast | brightness (−1–1, 0), contrast (0–2, 1) |
exposure | exposure (−2–2, 0) |
gamma | gamma_value (0.5–2.5, 1) |
color_balance | shadows_/midtones_/highlights_ × cyan_red, magenta_green, yellow_blue (each −1–1, 0) |
shadows_highlights | shadows (−1–1, 0), highlights (−1–1, 0) |
Color Management
| Effect id | Parameters (range, default) |
|---|---|
black_white | contrast (0.5–2, 1) |
sepia | tone_strength (0–2, 1), saturation (0–2, 1) |
invert | amount (0–1, 1) |
hue_saturation | hue (−180–180, 0), saturation (−1–2, 1), lightness (−1–1, 0) |
color_temperature | temperature (−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 id | Parameters (range, default) |
|---|---|
add_color | add_r, add_g, add_b (each −1–1, 0) |
multiply_color | mul_r, mul_g, mul_b (each 0–2, 1) |
vibrance | vibrance (−1–2, 0) |
color_curves | curve_amount (−1–1, 0) — shown as S-Curve Contrast: one strength value toward a fixed S-curve, not an editable curve. |
Blur & Sharpening
| Effect id | Parameters (range, default) |
|---|---|
blur | blur_amount (0.5–5, 2) |
sharpen | sharpness (0.5–3, 1.5) — 1 leaves the picture untouched, above 1 sharpens, below 1 softens; the average brightness stays the same. |
motion_blur | blur_angle (0–360, 0), blur_strength (0–1, 0) |
Artistic Effects
| Effect id | Parameters (range, default) |
|---|---|
pixelate | pixel_size (1–50, 8) |
edge | edge_strength (0–2, 1) |
oil_painting | brush_size (1–10, 3), intensity (0–1, 0.5) |
toon | levels (2–8, 4), edge_threshold (0–1, 0.3), edge_strength (0–1, 1) |
kaleidoscope | segments (2–32, 6), rotation (0–360, 0), zoom (0.1–5, 1), center_x/center_y (0–1, 0.5) |
Stylize
| Effect id | Parameters (range, default) |
|---|---|
chromatic_aberration | amount (0–0.06, 0.012) |
vignette | amount (0–1, 0.5), radius (0.2–1.5, 0.8), softness (0.05–1, 0.5) |
posterize | levels (2–32, 6) |
halftone | scale (20–300, 90), softness (0–1, 0.4) |
scanlines | count (100–1080, 480), intensity (0–1, 0.4) |
Distortion & Projection
| Effect id | Parameters (range, default) |
|---|---|
dome | azimuth (−360–360, 90), elevation (−179–179, 50), rotation (0–90, 0) |
fisheye180_dome | azimuth (−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) |
fish2dome | azimuth (−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_flat2grid | ratiox (1–100, 16), ratioy (1–100, 9), azimuth (0–360, 180), elevation (0–90, 55), fov (1–180, 45) |
rectangle_to_dome | dome_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_plane2fisheye | azimuth (0–360, 0), altitude (0–90, 90), zoom (1–350, 100), fov (1–360, 180), camera_x/camera_y (−100–100, 0) |
lens_distortion | barrel_amount (−1–1, 0), vignette (0–1, 0) |
camera_intrinsic | focal_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) |
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:
fisheyeFOVis 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_sizedescribe 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 id | Parameters (range, default) |
|---|---|
dome_hyperspace | speed (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_aurora | speed (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_fluid | speed (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_fire | speed (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 id | Parameters (range, default) |
|---|---|
led_moire | led_moire_strength (0–1, 0.5), led_moire_h_radius/led_moire_v_radius (0–4, 1) |
led_black_lift | led_black_lift (0–0.15, 0.02), led_black_gamma (0.5–2, 1), led_white_clip (0.8–1, 1) |
led_pixel_grid | led_grid_pitch (1–32, 4), led_grid_gap (0–0.6, 0.15), led_grid_darkness (0–1, 0.8) |
led_gamut_limiter | led_max_sat (0–2, 1), led_sat_rolloff (0–1, 0.3), led_skin_protect (0–1, 0) |
eye_adapt | eye_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) |
Related
- Visual Effects — the Inspector workflow
- Generators — generative clips, a separate feature with its own
realtime.params.*paths - TCP Command API · HTTP REST API
