Add LumaMap, LumaThreshold, BlockRepeat, alpha dithered ADither to orx-fx

This commit is contained in:
Edwin Jakobs
2020-02-05 17:44:38 +01:00
parent 4e241aca6c
commit dce423fe88
6 changed files with 146 additions and 17 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 LumaMap : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-map.frag"))) {
@ColorParameter("foreground color")
var foreground: ColorRGBa by parameters
@ColorParameter("background color")
var background: ColorRGBa by parameters
@DoubleParameter("background opacity", 0.0, 1.0)
var backgroundOpacity: Double by parameters
@DoubleParameter("foreground opacity", 0.0, 1.0)
var foregroundOpacity: Double by parameters
init {
foreground = ColorRGBa.WHITE
background = ColorRGBa.BLACK
foregroundOpacity = 1.0
backgroundOpacity = 1.0
}
}

View File

@@ -10,8 +10,7 @@ import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
@Description("Luma threshold ")
class Threshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-threshold.frag"))) {
class LumaThreshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFragmentCode("color/luma-threshold.frag"))) {
@DoubleParameter("threshold value", 0.0, 1.0)
var threshold: Double by parameters
@@ -34,5 +33,4 @@ class Threshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFr
foregroundOpacity = 1.0
backgroundOpacity = 1.0
}
}

View File

@@ -0,0 +1,44 @@
package org.openrndr.extra.fx.distort
import org.openrndr.draw.Filter
import org.openrndr.draw.Shader
import org.openrndr.extra.fx.filterFragmentCode
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
@Description("Horizontal wave")
class BlockRepeat : Filter(Shader.createFromCode(filterVertexCode, filterFragmentCode("distort/block-repeat.frag"))) {
@DoubleParameter("block width", 0.0, 1.0, order = 0)
var blockWidth: Double by parameters
@DoubleParameter("block height", 0.0, 1.0, order = 1)
var blockHeight: Double by parameters
@DoubleParameter("block x-offset", -0.5, 0.5, order = 2)
var blockOffsetX: Double by parameters
@DoubleParameter("block y-offset", -0.5, 0.5, order = 3)
var blockOffsetY: Double by parameters
/**
* Source scale, 0.0 is a 1:1 mapping, 1.0 fits entire source image in block
*/
@DoubleParameter("source scale", 0.0, 1.0, order = 4)
var sourceScale: Double by parameters
@DoubleParameter("source x-offset", -0.5, 0.5, order = 5)
var sourceOffsetX: Double by parameters
@DoubleParameter("source y-offset", -.5, .5, order = 6)
var sourceOffsetY: Double by parameters
init {
blockWidth = 0.25
blockHeight = 0.25
blockOffsetX = 0.0
blockOffsetY = 0.0
sourceOffsetX = 0.0
sourceOffsetY = 0.0
sourceScale = 0.0
}
}

View File

@@ -0,0 +1,18 @@
#version 330 core
in vec2 v_texCoord0;
uniform sampler2D tex0; // input
uniform vec4 foreground;
uniform vec4 background;
uniform float foregroundOpacity;
uniform float backgroundOpacity;
uniform float threshold;
out vec4 o_color;
void main() {
vec4 c = texture(tex0, v_texCoord0);
vec4 fgc = foreground * foregroundOpacity;
vec4 bgc = background * backgroundOpacity;
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;
}

View File

@@ -0,0 +1,41 @@
#version 330 core
in vec2 v_texCoord0;
uniform sampler2D tex0;// input
uniform float blockWidth;
uniform float blockHeight;
uniform float blockOffsetX;
uniform float blockOffsetY;
uniform float sourceOffsetX;
uniform float sourceOffsetY;
uniform float sourceScale;
out vec4 o_color;
void main() {
vec2 uv = v_texCoord0;
vec2 blockSize = vec2(blockWidth, blockHeight);
vec2 blockOffset = vec2(blockOffsetX, blockOffsetY);
vec2 blockCoord = uv / blockSize + blockOffset;
ivec2 blockIndex = ivec2(blockCoord);
vec2 blockUV = mod(blockCoord - blockIndex, vec2(1.0));
vec2 blockAspect = vec2(1.0);
if (blockWidth < blockHeight) {
blockAspect = vec2(blockWidth / blockHeight, 1.0);
}
if (blockHeight < blockWidth) {
blockAspect = vec2(1.0, blockHeight/blockWidth);
}
vec2 tUV = mix(blockUV * blockSize, blockUV * blockAspect, sourceScale);
// vec2 fw = fwidth(blockCoord);
// float f = smoothstep(0.0, 0.01, blockUV.x) * smoothstep(0.0, 0.01, blockUV.y);
vec2 sourceOffset = vec2(sourceOffsetX, sourceOffsetY);
vec4 c = texture(tex0, mod(tUV + sourceOffset, vec2(1.0)));
o_color = c;
}

View File

@@ -27,29 +27,25 @@ float mask4(int levels, float l, int x, int y, int c) {
return floor(levels * l + mask)/levels;
}
out vec4 o_color;
void main() {
vec4 c = texture(tex0, v_texCoord0);
if (c.a > 0.0) {
c.rgb/=c.a;
}
ivec2 ic = ivec2(v_texCoord0 * textureSize(tex0, 0));
vec3 rgb = vec3(1.0, 0.0, 1.0);
vec4 rgba = vec4(0.0);
if (pattern == 0) {
rgb = vec3(mask1(levels, c.r, ic.x, ic.y, 0), mask1(levels, c.g, ic.x, ic.y, 1), mask1(levels, c.b, ic.x, ic.y, 2));
rgba = vec4(mask1(levels, c.r, ic.x, ic.y, 0), mask1(levels, c.g, ic.x, ic.y, 1), mask1(levels, c.b, ic.x, ic.y, 2), mask1(levels, c.a, ic.x, ic.y, 3));
} else if (pattern == 1) {
rgb = vec3(mask2(levels, c.r, ic.x, ic.y, 0), mask2(levels, c.g, ic.x, ic.y, 1), mask2(levels, c.b, ic.x, ic.y, 2));
rgba = vec4(mask2(levels, c.r, ic.x, ic.y, 0), mask2(levels, c.g, ic.x, ic.y, 1), mask2(levels, c.b, ic.x, ic.y, 2), mask2(levels, c.a, ic.x, ic.y, 3));
} else if (pattern == 2) {
rgb = vec3(mask3(levels, c.r, ic.x, ic.y, 0), mask3(levels, c.g, ic.x, ic.y, 1), mask3(levels, c.b, ic.x, ic.y, 2));
rgba = vec4(mask3(levels, c.r, ic.x, ic.y, 0), mask3(levels, c.g, ic.x, ic.y, 1), mask3(levels, c.b, ic.x, ic.y, 2), mask3(levels, c.a, ic.x, ic.y, 3));
} else {
rgb = vec3(mask4(levels, c.r, ic.x, ic.y, 0), mask4(levels, c.g, ic.x, ic.y, 1), mask4(levels, c.b, ic.x, ic.y, 2));
rgba = vec4(mask4(levels, c.r, ic.x, ic.y, 0), mask4(levels, c.g, ic.x, ic.y, 1), mask4(levels, c.b, ic.x, ic.y, 2), mask4(levels, c.a, ic.x, ic.y, 3));
}
o_color.rgb = rgb;
o_color.a = 1.0;
rgba.rgb *= rgba.a;
o_color = rgba;
}