12 KiB
orx-fx
Ready-to-use GPU-based visual effects or filters. Most include orx-parameters annotations so they can be easily controlled via orx-gui.
The provided filters are based on OPENRNDR's
Filter class
All filters provided by orx-fx assume pre-multiplied alpha inputs, which is OPENRNDR's default.
Effects index
Here's a (potentially incomplete) list of the effects provided by orx-fx. Explore the source for an up-to-date list.
Anti-alias
FXAA, fast approximate anti-aliasing.
Blends
Blend filters take two inputs ("source" and "destination"), they are intended to be used in orx-compositor's layer blend. All blend filters are opacity preserving.
Photoshop-style blends
ColorBurnColorDodgeDarkenHardLightLightenMultiplyNormalOverlayScreenAdd, add source and destination inputsSubtract, substract destination color from source color
Porter-Duff blends
SourceIn, Porter-Duff source-in blend, intersect source and destination opacity and keep source colorsSourceOut, Porter-Duff source-out blend, subtract destination from source opacity and keep source colorsSourceAtop, Porter-Duff source-atop blend, uses destination opacity, layers source on top and keeps both colorsDestinationIn, Porter-Duff destination-in blend, intersect source and destination opacity and keep source colorsDestinationOut, Porter-Duff destination-out blend, subtract destination from source opacity and keep destination colorsDestinationAtop, Porter-Duff destination-atop blend, uses source opacity, layers destination on top and keeps both colorsXor, Porter-Duff xor blend, picks colors from input with highest opacity or none with opacities are equal
Various blends
Passthrough, pass source color and opacity.
Blurs
Most blur effects are opacity preserving
ApproximateGaussianBlur, a somewhat faster but less precise implementation ofGaussianBlurBloom, a multi-pass bloom/glow effectBoxBlur, a simple but fast box blurFrameBlurGaussianBlur, a slow but precise Gaussian blurHashBlur, a noisy blur effectLaserBlurLineBlurMipBloomZoomBlur, a directional blur with a zooming effect
Color
ChromaticAberration, a chromatic aberration effect based on RGB color separationColorCorrection, corrections for brightness, contrast, saturation and hueColorLookup, Color LUT filterColorMix, filter implementation of OPENRNDR's color matrix mixingDuotone, maps luminosity to two colors, very similar toLumaMapbut uses LAB color interpolation.DuotoneGradient, a two-point gradient version ofDuotoneInvertLumaMap, maps luminosity to two colorsLumaOpacity, maps luminosity to opacity but retains source colorLumaThreshold, applies a treshold on the input luminosity and maps to two colorsPosterize, a posterize effectSepia, applies a reddish-brown monochrome tint that imitates an old photographSetBackgroundSubtractConstant, subtract a constant color from the source color
Color conversion
OkLabToRgbRgbToOkLab
Distortion
All distortion effects are opacity preserving
BlockRepeat- repeats a single configurable block of the source inputDisplaceBlendFisheyeFluidDistortLensesHorizontalWave- applies a horizontal wave effect on the source inputVerticalWave- applies a vertical wave effect on the source inputPerspectivePlane- applies a planar perspective distortion on the source inputPerturbPolarToRectangularRectangularToPolarStackRepeat- repeats the source input in a stack fashionStretchWavesTapeNoiseTilesVideoGlitch
Dither
ADither- a selection of dithering effectsCMYKHalftone- a configurable CMYK halftoning effectCrosshatch- crosshatching effectLumaHalftone- a halftoning effect based on luminosity
Edges
LumaSobel- A Sobel-kernel based luminosity edge detectorEdgesWork- An edges filter doubling as erosionContour- detects multi-level contours- New:
CannyEdgeDetector
Grain
FilmGrain- adds film-like grain to the source input
Shadow
DropShadow- adds a drop shadow based on the opacity in the input image
Tonemap
Uncharted2Tonemap- implements the Uncharted2 tonemapper
Transform
FlipVertically- flips the source input vertically.
Post extension
The Post extension provides an easy way to apply filters to your drawings. Allocating
and resizing color buffers is all taken care of by Post.
To get additional intermediate color buffers one can access intermediate[x]
fun main() = application {
configure {
windowResizable = true
}
program {
extend(Post()) {
val blur = ApproximateGaussianBlur()
val add = Add()
post { input, output ->
blur.window = 50
blur.sigma = 50.0
blur.apply(input, intermediate[0])
add.apply(arrayOf(input, intermediate[0]), output)
}
}
extend {
drawer.circle(width / 2.0, height / 2.0, 100.0)
}
}
}
Colormap
Colormap filters operate only on the RED color channel. For example depth maps from orx-depth-camera.
They allow selection of min / max value range and applying exponential
shaping curve within this range:
GrayscaleColormap- maps to gray tonesSpectralZucconiColormap- maps to natural light dispersion spectrum as described by Alan Zucconi in the Improving the Rainbow article.TurboColormap- maps to Turbo Colormap according to Turbo, An Improved Rainbow Colormap for Visualization by Google.
Demos
DemoApproximateGaussianBlur01
DemoBlur01
DemoCannyEdgeDetector01
DemoColorDuotone01
DemoColorDuotoneGradient01
DemoColormapGrayscale
DemoColormapSpectralZucconi
DemoColormapTurbo
DemoColorPosterize01
DemoCompositeFilter01
DemoContour01
Demonstrate the Contour filter
@author Edwin Jakobs

DemoDirectionalBlur01
Demonstrates how to use [DirectionalBlur] by creating a direction
ColorBuffer in which the red and green components of the pixels point
in various directions where to sample pixels from. All the pixel colors
of the ColorBuffer are set one by one using two for loops.
Note the FLOAT32 color type of the buffer to allow for negative values, so sampling can happen from every direction.
Every 60 animation frames the centerWindow property is toggled
between true and false to demonstrate how the result changes.
DemoDirectionalDisplace01
Demonstrate how to use [DirectionalDisplace].
The direction map is populated using drawImage instead of
pixel by pixel. A grid of circles is drawn, each circle with a
color based on simplex noise. The R and G channels of the colors
control the direction of the sampling. By animating the sampling
distance the result oscillates between no-effect and a noticeable one.

DemoDirectionalDisplace02
Demonstrate how to use [DirectionalDisplace].
The program draws 12 overlapping translucent circles on the
direction color buffer to produce new color combinations
on the overlapping areas. Those colors specify where the
DirectionalDisplace effect will sample pixels from.

DemoDistortLenses01
DemoDitherLumaHalftone01
DemoFluidDistort01
DemoOkLab01
This demonstrates converting a [ColorBuffer] from and to (OK)LAB color space using the [RgbToOkLab] and [OkLabToRgb]
filters. The (OK)Lab representation is signed and requires a floating point representation.
















