Add VideoGlitch and TapeNoise filters

This commit is contained in:
Edwin Jakobs
2020-05-06 16:55:37 +02:00
parent 75fcb6d5af
commit 538590c2f0
6 changed files with 208 additions and 2 deletions

View File

@@ -11,6 +11,7 @@ sourceSets {
dependencies {
api project(":orx-parameters")
implementation project(":orx-noise")
demoImplementation("org.openrndr:openrndr-ffmpeg:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoImplementation(project(":orx-gui"))

View File

@@ -5,10 +5,8 @@ import org.openrndr.draw.ColorType
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.fx.filterFragmentUrl
import org.openrndr.extra.noise.simplex
import org.openrndr.extra.parameters.*
import org.openrndr.math.Vector2
import java.lang.Math.pow
private class LaserBlurPass : Filter(filterShaderFromUrl(filterFragmentUrl("blur/laser-blur.frag"))) {
var radius: Double by parameters

View File

@@ -0,0 +1,29 @@
package org.openrndr.extra.fx.distort
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.fx.filterFragmentUrl
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
@Description("Tape noise")
class TapeNoise : Filter(filterShaderFromUrl(filterFragmentUrl("distort/tape-noise.frag"))) {
var time: Double by parameters
@DoubleParameter("gain", 0.0, 1.0)
var gain: Double by parameters
@DoubleParameter("noise low", 0.0, 1.0)
var noiseLow: Double by parameters
@DoubleParameter("noise high", 0.0, 1.0)
var noiseHigh: Double by parameters
init {
gain = 0.5
noiseLow = 0.5
noiseHigh = 0.8
}
}

View File

@@ -0,0 +1,56 @@
package org.openrndr.extra.fx.distort
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.fx.filterFragmentUrl
import org.openrndr.extra.parameters.BooleanParameter
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
@Description("Video glitch")
class VideoGlitch : Filter(filterShaderFromUrl(filterFragmentUrl("distort/video-glitch.frag"))) {
var time: Double by parameters
@DoubleParameter("amplitude", 0.0, 10.0)
var amplitude: Double by parameters
@DoubleParameter("border height", 0.0, 0.5)
var borderHeight: Double by parameters
@DoubleParameter("vertical frequency", 0.0, 10.0)
var vfreq: Double by parameters
@DoubleParameter("horizontal frequency", 0.0, 80.0)
var hfreq: Double by parameters
@DoubleParameter("p frequency", 0.0, 10.0)
var pfreq: Double by parameters
@DoubleParameter("p offset", -1.0, 1.0)
var poffset: Double by parameters
@DoubleParameter("scroll offset 0", 0.0, 1.0)
var scrollOffset0: Double by parameters
@DoubleParameter("scroll offset 1", 0.0, 1.0)
var scrollOffset1: Double by parameters
@BooleanParameter("linear input")
var linearInput: Boolean by parameters
@BooleanParameter("linear output")
var linearOutput: Boolean by parameters
init {
amplitude = 1.0
vfreq = 4.0
pfreq = 10.0
hfreq = 80.0
poffset = 0.0
scrollOffset0 = 0.0
scrollOffset1 = 0.0
borderHeight = 0.05
linearInput = false
linearOutput = false
}
}

View File

@@ -0,0 +1,53 @@
#version 330 core
out vec4 o_output;
uniform sampler2D tex0;
in vec2 v_texCoord0;
uniform float time;
uniform float gain;
uniform float noiseLow;
uniform float noiseHigh;
#define HASHSCALE 443.8975
vec2 hash22(vec2 p) {
vec3 p3 = fract(vec3(p.xyx) * HASHSCALE);
p3 += dot(p3, p3.yzx+19.19);
return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));
}
vec3 saturate(vec3 x) {
return clamp(x, vec3(0.0), vec3(1.0));
}
vec3 aberrationColor(float f) {
f = f * 3.0 - 1.5;
return saturate(vec3(-f, 1.0 - abs(f), f));
}
void main() {
float dk = 1.0/600.0;
for (int k = 0; k < 10; ++k ) {
vec2 duv = v_texCoord0;
duv.y += smoothstep(pow(cos(time+k*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.0, v_texCoord0.x)*0.1 * cos(time+k*dk);
duv.y += smoothstep(pow(1.0-cos(time+k*dk+v_texCoord0.y*1.0),10.0)*0.1+0.1, 0.9, v_texCoord0.x)*0.1 * cos(time+k*dk);
duv.y += sin(v_texCoord0.x*3.1415926535)*0.0;
float bc = floor(hash22(vec2(time+k*dk, (time+k*dk)*0.1)).x*20.0);
float gb3 = floor(duv.y*bc)/bc;
vec2 v = hash22(duv.xy*0.003+time+k*dk);
vec2 v2 = hash22(duv.xy*0.03+time+k*dk);
vec2 v2b = hash22(duv.yx*0.03+time+k*dk);
float stretch = (cos(time+k*dk)*0.001+0.002)*0.3+0.001;
vec2 h = hash22(duv.yy*stretch+time+k*dk);
float gap = smoothstep(-1.0, -0.99, cos(gb3*(10.0+duv.y*10.0 + (time+k*dk)*10.0) +duv.x*10.0)) * (cos(gb3)*0.5+0.5);
float r = smoothstep(noiseLow, noiseHigh, h.x*gap*v2.x)*1.0;
float g = smoothstep(noiseLow, noiseHigh, h.x*gap*v2.y)*1.0;
float b = smoothstep(noiseLow, noiseHigh, h.x*gap*v2b.x)*1.0;
float a = smoothstep(noiseLow, noiseHigh, h.x*gap*v2b.y)*1.0;
o_output += vec4(r,g,b,a)*gain;
}
o_output *= o_output.a;
o_output += texture(tex0, v_texCoord0);
}

View File

@@ -0,0 +1,69 @@
#version 330 core
out vec4 o_output;
uniform sampler2D tex0;
in vec2 v_texCoord0;
uniform float time;
uniform float amplitude;
uniform float vfreq;
uniform float pfreq;
uniform float hfreq;
uniform float poffset;
uniform float scrollOffset0;
uniform float scrollOffset1;
uniform float borderHeight;
uniform bool linearInput;
uniform bool linearOutput;
#define HASHSCALE 443.8975
vec2 hash22(vec2 p) {
vec3 p3 = fract(vec3(p.xyx) * HASHSCALE);
p3 += dot(p3, p3.yzx+19.19);
return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y));
}
vec3 saturate(vec3 x) {
return clamp(x, vec3(0.0), vec3(1.0));
}
vec4 getVideo(vec2 uv, float amplitude, float seconds) {
float iTime = seconds;
vec2 look = mod(uv, vec2(1.0));
float window = 1.0/(1.0 + 20.0*(look.y-mod(iTime*vfreq, 1.0))*(look.y-mod(iTime*vfreq, 1.)));
look.x = look.x + sin(look.y*pfreq + poffset * 3.1415)/50 *(1.+cos(iTime*hfreq))*window*amplitude;
look.y = mod(look.y, 1.);
vec4 video = texture(tex0, look);
return video;
}
vec4 aberrationColor(float f) {
f = f * 3.0 - 1.5;
return vec4(saturate(vec3(-f, 1.0 - abs(f), f)), 1.0);
}
void main() {
vec4 c = vec4(0.0);
float aa = amplitude + smoothstep(borderHeight, 0.0, v_texCoord0.y)*4.0 + smoothstep(1.0-borderHeight, 1.0, v_texCoord0.y)*4.0;
float ds = scrollOffset1 - scrollOffset0;
if (aa > 0.0 || ds > 0.0) {
for (int i = 1; i < 16; ++i) {
vec4 lc = getVideo(v_texCoord0 + vec2(0.0, scrollOffset0+ds*i), aa, time-i/(16*60.0));
if (!linearInput) {
lc.rgb = pow(lc.rgb, vec3(2.2));
}
c += lc * (3.0/16.0) * aberrationColor(i/16.0);
}
o_output = c;
} else {
vec4 lc = texture(tex0, mod(v_texCoord0 + vec2(0.0, scrollOffset1), vec2(1.0)));
if (!linearInput) {
lc.rgb = pow(lc.rgb, vec3(2.2));
}
o_output = lc;
}
if (!linearOutput) {
o_output.rgb = pow(o_output.rgb, vec3(1/2.2));
}
}