From 6e6f095439f292bbbfcfb872b69dd35f5c309108 Mon Sep 17 00:00:00 2001 From: Ricardo Matias Date: Tue, 7 Jan 2020 14:53:48 +0100 Subject: [PATCH] Add Chromatic Aberration effect --- .../main/kotlin/color/ChromaticAberration.kt | 40 +++++++++++++++++++ .../fx/gl3/color/chromatic-aberration.frag | 23 +++++++++++ 2 files changed, 63 insertions(+) create mode 100644 orx-fx/src/main/kotlin/color/ChromaticAberration.kt create mode 100644 orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/chromatic-aberration.frag diff --git a/orx-fx/src/main/kotlin/color/ChromaticAberration.kt b/orx-fx/src/main/kotlin/color/ChromaticAberration.kt new file mode 100644 index 00000000..d6544020 --- /dev/null +++ b/orx-fx/src/main/kotlin/color/ChromaticAberration.kt @@ -0,0 +1,40 @@ +package org.openrndr.extra.fx.color + +import org.openrndr.draw.* +import org.openrndr.extra.fx.filterFragmentCode +import org.openrndr.math.Vector2 +import org.openrndr.resourceUrl + +class ChromaticAberration : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/chromatic-aberration.frag"))){ + /** + * aberration factor, default value is 1.0 + */ + var aberrationFactor: Double by parameters + + + init { + aberrationFactor = 8.0 + } + + private var intermediate: ColorBuffer? = null + + override fun apply(source: Array, target: Array) { + intermediate?.let { + if (it.width != target[0].width || it.height != target[0].height) { + intermediate = null + } + } + + if (intermediate == null) { + intermediate = colorBuffer(target[0].width, target[0].height, target[0].contentScale, target[0].format, target[0].type) + } + + intermediate?.let { + parameters["dimensions"] = Vector2(it.effectiveWidth.toDouble(), it.effectiveHeight.toDouble()) + + super.apply(source, arrayOf(it)) + + it.copyTo(target[0]) + } + } +} diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/chromatic-aberration.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/chromatic-aberration.frag new file mode 100644 index 00000000..f74a633b --- /dev/null +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/color/chromatic-aberration.frag @@ -0,0 +1,23 @@ +#version 330 + +in vec2 v_texCoord0; + +uniform sampler2D tex0; + +uniform float aberrationFactor; +uniform vec2 dimensions; + +out vec4 o_color; + +void main() { + vec2 uv = v_texCoord0; + float factor = (1.0 / dimensions.x) * aberrationFactor; + + vec4 tex = texture(tex0, uv); + + float r = texture(tex0, vec2(uv.x - factor, uv.y)).r; + float g = tex.g; + float b = texture(tex0, vec2(uv.x + factor, uv.y)).b; + + o_color = vec4(vec3(r, g, b), tex.a); +} \ No newline at end of file