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
|
||||
|
||||
@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
|
||||
}
|
||||
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user