[orx-fx] Add fisheye distortion to Lenses Filter

This commit is contained in:
Rein van der Woerd
2022-02-01 18:05:07 +01:00
parent 95f4ccf5f2
commit ddbbb2c2a6
3 changed files with 25 additions and 17 deletions

View File

@@ -9,15 +9,15 @@ import org.openrndr.extra.fx.mppFilterShader
import org.openrndr.extra.parameters.BooleanParameter import org.openrndr.extra.parameters.BooleanParameter
import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.extra.parameters.IntParameter
@Description("Lenses") @Description("Lenses")
class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) { class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) {
@DoubleParameter("block width", 0.0, 1.0, order = 0) @IntParameter("rows", 1, 64, order = 0)
var blockWidth: Double by parameters var rows: Int by parameters
@DoubleParameter("block height", 0.0, 1.0, order = 1)
var blockHeight: Double by parameters
@IntParameter("columns", 1, 64, order = 1)
var columns: Int by parameters
@DoubleParameter("scale", 0.5, 1.5, order = 2) @DoubleParameter("scale", 0.5, 1.5, order = 2)
var scale: Double by parameters var scale: Double by parameters
@@ -25,6 +25,9 @@ class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) {
@DoubleParameter("rotation", -180.0, 180.0, order = 3) @DoubleParameter("rotation", -180.0, 180.0, order = 3)
var rotation: Double by parameters var rotation: Double by parameters
@DoubleParameter("distort", -1.0, 1.0, order = 4)
var distort: Double by parameters
@BooleanParameter("bicubic filtering") @BooleanParameter("bicubic filtering")
var bicubicFiltering: Boolean by parameters var bicubicFiltering: Boolean by parameters
@@ -37,8 +40,9 @@ class Lenses : Filter(mppFilterShader(fx_lenses, "block-repeat")) {
} }
init { init {
blockWidth = 0.25 rows = 6
blockHeight = 0.25 columns = 8
distort = 0.0
bicubicFiltering = true bicubicFiltering = true
} }

View File

@@ -2,7 +2,6 @@ import org.openrndr.application
import org.openrndr.draw.createEquivalent import org.openrndr.draw.createEquivalent
import org.openrndr.draw.loadImage import org.openrndr.draw.loadImage
import org.openrndr.extra.fx.distort.Lenses import org.openrndr.extra.fx.distort.Lenses
import kotlin.math.cos
fun main() = application { fun main() = application {
configure { configure {
@@ -16,7 +15,8 @@ fun main() = application {
val edges = image.createEquivalent() val edges = image.createEquivalent()
extend { extend {
lenses.rotation = 0.0 lenses.rotation = 0.0
lenses.scale = 1.4 lenses.scale = 1.5
lenses.apply(image, edges) lenses.apply(image, edges)
drawer.image(edges) drawer.image(edges)
} }

View File

@@ -2,25 +2,29 @@ in vec2 v_texCoord0;
uniform sampler2D tex0;// input uniform sampler2D tex0;// input
uniform float scale; uniform float scale;
uniform float rotation; uniform float rotation;
uniform int rows;
uniform int columns;
uniform float distort;
out vec4 o_color; out vec4 o_color;
void main() { void main() {
vec2 uv = v_texCoord0; vec2 uv = v_texCoord0;
vec2 blockSize = vec2(1.0/8.0, 1.0/6.0); vec2 blockSize = vec2(1.0/columns, 1.0/rows);
vec2 blockIndex = floor(uv / blockSize); vec2 blockIndex = floor(uv / blockSize);
vec2 blockUV = mod(uv/blockSize, vec2(1.0));
vec2 blockUVC1 = (blockUV - vec2(0.5)) * 2.0;
vec2 blockCenter = (blockIndex+0.5) * blockSize; vec2 blockCenter = (blockIndex+0.5) * blockSize;
float ca = cos(radians(rotation)); float ca = cos(radians(rotation));
float sa = sin(radians(rotation)); float sa = sin(radians(rotation));
vec2 ts = textureSize(tex0, 0); vec2 ts = textureSize(tex0, 0);
mat2 rm = mat2(1.0, 0.0, 0.0, ts.x/ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y/ts.x);
mat2 rm =mat2(1.0, 0.0, 0.0, ts.x/ts.y) * mat2(vec2(ca, sa), vec2(-sa, ca)) * mat2(1.0, 0.0, 0.0, ts.y/ts.x); vec2 ruv = (uv - blockCenter);
vec2 cuv = (rm * (uv - blockCenter) vec2 luv;
* scale + blockCenter); luv.x = (1.0 - blockUVC1.y * blockUVC1.y * distort) * ruv.x;
luv.y = (1.0 - blockUVC1.x * blockUVC1.x * distort) * ruv.y;
vec2 cuv = (rm * luv * scale + blockCenter);
float sx = step(0.0, cuv.x) * (1.0 - step(1.0, cuv.x)); float sx = step(0.0, cuv.x) * (1.0 - step(1.0, cuv.x));
float sy = step(0.0, cuv.y) * (1.0 - step(1.0, cuv.y)); float sy = step(0.0, cuv.y) * (1.0 - step(1.0, cuv.y));