Add LumaMap, LumaThreshold, BlockRepeat, alpha dithered ADither to orx-fx
This commit is contained in:
32
orx-fx/src/main/kotlin/color/LumaMap.kt
Normal file
32
orx-fx/src/main/kotlin/color/LumaMap.kt
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,8 +10,7 @@ import org.openrndr.extra.parameters.Description
|
|||||||
import org.openrndr.extra.parameters.DoubleParameter
|
import org.openrndr.extra.parameters.DoubleParameter
|
||||||
|
|
||||||
@Description("Luma threshold ")
|
@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)
|
@DoubleParameter("threshold value", 0.0, 1.0)
|
||||||
var threshold: Double by parameters
|
var threshold: Double by parameters
|
||||||
|
|
||||||
@@ -34,5 +33,4 @@ class Threshold : Filter(Shader.createFromCode(Filter.filterVertexCode, filterFr
|
|||||||
foregroundOpacity = 1.0
|
foregroundOpacity = 1.0
|
||||||
backgroundOpacity = 1.0
|
backgroundOpacity = 1.0
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
44
orx-fx/src/main/kotlin/distort/BlockRepeat.kt
Normal file
44
orx-fx/src/main/kotlin/distort/BlockRepeat.kt
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -27,29 +27,25 @@ float mask4(int levels, float l, int x, int y, int c) {
|
|||||||
return floor(levels * l + mask)/levels;
|
return floor(levels * l + mask)/levels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
out vec4 o_color;
|
out vec4 o_color;
|
||||||
void main() {
|
void main() {
|
||||||
vec4 c = texture(tex0, v_texCoord0);
|
vec4 c = texture(tex0, v_texCoord0);
|
||||||
|
if (c.a > 0.0) {
|
||||||
|
c.rgb/=c.a;
|
||||||
|
}
|
||||||
ivec2 ic = ivec2(v_texCoord0 * textureSize(tex0, 0));
|
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) {
|
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) {
|
} 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) {
|
} 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 {
|
} 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rgba.rgb *= rgba.a;
|
||||||
|
o_color = rgba;
|
||||||
o_color.rgb = rgb;
|
|
||||||
o_color.a = 1.0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user