Add LumaOpacity, StackRepeat filters, fix LumaMap, add bicubic filtering

This commit is contained in:
Edwin Jakobs
2020-02-08 23:50:09 +01:00
parent a6d4e38fb9
commit 6c48cf2e83
7 changed files with 159 additions and 5 deletions

View File

@@ -0,0 +1,32 @@
package org.openrndr.extra.fx.color
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.Filter
import org.openrndr.draw.Shader
import org.openrndr.extra.fx.filterFragmentCode
import org.openrndr.extra.parameters.BooleanParameter
import org.openrndr.extra.parameters.ColorParameter
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
@Description("Luma map ")
class LumaOpacity : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-opacity.frag"))) {
@DoubleParameter("foreground luma",0.0, 1.0)
var foregroundLuma: Double by parameters
@DoubleParameter("background luma", 0.0,1.0)
var backgroundLuma: Double by parameters
@DoubleParameter("background opacity", 0.0, 1.0, order = 0)
var backgroundOpacity: Double by parameters
@DoubleParameter("foreground opacity", 0.0, 1.0, order = 1)
var foregroundOpacity: Double by parameters
init {
foregroundLuma = 1.0
backgroundLuma = 0.0
foregroundOpacity = 1.0
backgroundOpacity = 0.0
}
}

View File

@@ -6,7 +6,7 @@ import org.openrndr.extra.fx.filterFragmentCode
import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter import org.openrndr.extra.parameters.DoubleParameter
@Description("Horizontal wave") @Description("Block repeat")
class BlockRepeat : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/block-repeat.frag"))) { class BlockRepeat : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/block-repeat.frag"))) {
@DoubleParameter("block width", 0.0, 1.0, order = 0) @DoubleParameter("block width", 0.0, 1.0, order = 0)
var blockWidth: Double by parameters var blockWidth: Double by parameters

View File

@@ -0,0 +1,48 @@
package org.openrndr.extra.fx.distort
import org.openrndr.draw.*
import org.openrndr.extra.fx.filterFragmentCode
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.extra.parameters.IntParameter
@Description("Stack repeat")
class StackRepeat : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/stack-repeat.frag"))) {
@DoubleParameter("zoom", -1.0, 1.0, order = 0)
var zoom: Double by parameters
@DoubleParameter("x-origin", -1.0, 1.0, order = 1)
var xOrigin: Double by parameters
@DoubleParameter("y-origin", -1.0, 1.0, order = 2)
var yOrigin: Double by parameters
@DoubleParameter("x-offset", -1.0, 1.0, order = 3)
var xOffset: Double by parameters
@DoubleParameter("y-offset", -1.0, 1.0, order = 4)
var yOffset: Double by parameters
@DoubleParameter("rotation", -180.0, 180.0, order = 5)
var rotation: Double by parameters
@IntParameter("repeats", 0, 16, order = 6)
var repeats: Int by parameters
init {
zoom = 0.0
repeats = 2
xOffset = 0.0
yOffset = 0.0
xOrigin = 0.0
yOrigin = 0.0
rotation = 0.0
}
var bicubicFiltering = true
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
if (bicubicFiltering && source.isNotEmpty()) {
source[0].generateMipmaps()
source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR)
}
super.apply(source, target)
}
}

View File

@@ -1,7 +1,6 @@
package org.openrndr.extra.fx.distort package org.openrndr.extra.fx.distort
import org.openrndr.draw.Filter import org.openrndr.draw.*
import org.openrndr.draw.Shader
import org.openrndr.extra.fx.filterFragmentCode import org.openrndr.extra.fx.filterFragmentCode
import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter import org.openrndr.extra.parameters.DoubleParameter
@@ -22,6 +21,15 @@ class HorizontalWave : Filter(Shader.createFromCode(filterVertexCode, filterFrag
amplitude = 0.1 amplitude = 0.1
phase = 0.0 phase = 0.0
} }
var bicubicFiltering = true
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
if (bicubicFiltering && source.isNotEmpty()) {
source[0].generateMipmaps()
source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR)
}
super.apply(source, target)
}
} }
@Description("Vertical wave") @Description("Vertical wave")
@@ -40,5 +48,13 @@ class VerticalWave : Filter(Shader.createFromCode(filterVertexCode, filterFragme
amplitude = 0.1 amplitude = 0.1
phase = 0.0 phase = 0.0
} }
var bicubicFiltering = true
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
if (bicubicFiltering && source.isNotEmpty()) {
source[0].generateMipmaps()
source[0].filter(MinifyingFilter.LINEAR_MIPMAP_LINEAR, MagnifyingFilter.LINEAR)
}
super.apply(source, target)
}
} }

View File

@@ -6,7 +6,6 @@ uniform vec4 foreground;
uniform vec4 background; uniform vec4 background;
uniform float foregroundOpacity; uniform float foregroundOpacity;
uniform float backgroundOpacity; uniform float backgroundOpacity;
uniform float threshold;
out vec4 o_color; out vec4 o_color;
void main() { void main() {
@@ -14,5 +13,5 @@ void main() {
vec4 fgc = foreground * foregroundOpacity; vec4 fgc = foreground * foregroundOpacity;
vec4 bgc = background * backgroundOpacity; vec4 bgc = background * backgroundOpacity;
float luma = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0)); float luma = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0));
o_color = mix(bgc, fgc, step(threshold, luma )) * c.a; o_color = mix(bgc, fgc, luma) * c.a;
} }

View File

@@ -0,0 +1,17 @@
#version 330 core
in vec2 v_texCoord0;
uniform sampler2D tex0; // input
uniform float foregroundLuma;
uniform float backgroundLuma;
uniform float foregroundOpacity;
uniform float backgroundOpacity;
out vec4 o_color;
void main() {
vec4 c = texture(tex0, v_texCoord0);
float l = dot( (c.a> 0.0? c.rgb/c.a : vec3(0.0)), vec3(1.0/3.0));
float mf = smoothstep(backgroundLuma, foregroundLuma, l);
float o = mix(backgroundOpacity, foregroundOpacity, mf);
o_color = c * o;
}

View File

@@ -0,0 +1,42 @@
#version 330 core
in vec2 v_texCoord0;
uniform sampler2D tex0;// input
uniform int repeats;
uniform float zoom;
uniform float xOrigin;
uniform float yOrigin;
uniform float xOffset;
uniform float yOffset;
uniform float rotation;
out vec4 o_color;
void main() {
vec2 origin = vec2((xOrigin+1.0)/2.0, (yOrigin+1.0)/2.0);
vec2 ts = textureSize(tex0, 0);
float r = ts.x/ts.y;
vec2 offset = vec2(1.0, r) * vec2(xOffset, yOffset);
vec2 uv = v_texCoord0 - vec2(origin);
float rad = (rotation/180) * 3.1415926535;
vec2 cs0 = vec2(cos(rad), -sin(rad));
vec2 cs1 = vec2(sin(rad), cos(rad));
mat2 rotStep = mat2(cs0, cs1);
mat2 rot = rotStep;
vec4 c = texture(tex0, v_texCoord0);
for (int i = 1; i <= repeats; ++i) {
//vec2 s = (uv * (1.0 + zoom) * i) + vec2(0.5);
vec2 s = (rot * uv * pow(1.0 + zoom,i*1.0) )+ vec2(origin) + vec2(offset) * i;
float f = s.x >= 0.0 && s.y > 0.0 && s.x < 1.0 && s.y < 1.0? 1.0 : 0.0;
vec4 sc = texture(tex0, s) * f;
c = c * (1.0-sc.a) + sc;
if (c.a > 1.0) {
c.a = 1.0;
}
rot *= rotStep;
}
o_color = c;
}