Following up on what rakoonic said in another thread, I suppose we could start putting examples up.
To start off, here’s one that does simplex noise (using code from Ashima Arts), with some time-based stuff thrown in.
-- generator.custom.simplex2 local kernel = {} kernel.language = "glsl" kernel.category = "generator" kernel.name = "simplex2" kernel.isTimeDependent = true kernel.fragment = [[// Uses 2D simplex noise from here: https://github.com/ashima/webgl-noise vec3 mod289(vec3 x) { return x - floor(x \* (1.0 / 289.0)) \* 289.0; } vec2 mod289(vec2 x) { return x - floor(x \* (1.0 / 289.0)) \* 289.0; } vec3 permute(vec3 x) { return mod289(((x\*34.0)+1.0)\*x); } float snoise(vec2 v) { const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 0.366025403784439, // 0.5\*(sqrt(3.0)-1.0) -0.577350269189626, // -1.0 + 2.0 \* C.x 0.024390243902439); // 1.0 / 41.0 // First corner vec2 i = floor(v + dot(v, C.yy) ); vec2 x0 = v - i + dot(i, C.xx); // Other corners vec2 i1; //i1.x = step( x0.y, x0.x ); // x0.x \> x0.y ? 1.0 : 0.0 //i1.y = 1.0 - i1.x; i1 = (x0.x \> x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); // x0 = x0 - 0.0 + 0.0 \* C.xx ; // x1 = x0 - i1 + 1.0 \* C.xx ; // x2 = x0 - 1.0 + 2.0 \* C.xx ; vec4 x12 = x0.xyxy + C.xxzz; x12.xy -= i1; // Permutations i = mod289(i); // Avoid truncation effects in permutation vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + i.x + vec3(0.0, i1.x, 1.0 )); vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); m = m\*m ; m = m\*m ; // Gradients: 41 points uniformly over a line, mapped onto a diamond. // The ring size 17\*17 = 289 is close to a multiple of 41 (41\*7 = 287) vec3 x = 2.0 \* fract(p \* C.www) - 1.0; vec3 h = abs(x) - 0.5; vec3 ox = floor(x + 0.5); vec3 a0 = x - ox; // Normalise gradients implicitly by scaling m // Approximation of: m \*= inversesqrt( a0\*a0 + h\*h ); m \*= 1.79284291400159 - 0.85373472095314 \* ( a0\*a0 + h\*h ); // Compute final noise value at P vec3 g; g.x = a0.x \* x0.x + h.x \* x0.y; g.yz = a0.yz \* x12.xz + h.yz \* x12.yw; return 130.0 \* dot(m, g); } P\_COLOR vec4 FragmentKernel( P\_UV vec2 texCoord ) { texCoord.xy \*= 25.0; texCoord.x += CoronaTotalTime \* 2.7; texCoord.y \*= sin(CoronaTotalTime \* 1.3); P\_COLOR float sample = snoise(texCoord); return CoronaColorScale( vec4(sample, sample, sample, 1) ); }]] return kernel
and the driver:
-- -- Abstract: CustomEffect sample app -- -- Sample code is MIT licensed, see http://www.coronalabs.com/links/code/license -- Copyright (C) 2015 Corona Labs Inc. All Rights Reserved. -- -- Supports Graphics 2.0 -- -- v1.0 2/4/2015 ------------------------------------------------------------ -- Setup local easing = require "easing" display.setStatusBar( display.HiddenStatusBar ) local image = display.newCircle(0, 0, 250)--Image( "Image1.jpg" ) image:scale( 0.5, 0.5 ) image.x = display.contentCenterX image.y = display.contentCenterY ------------------------------------------------------------ -- Debugging: -- Log compiler errors found in shader code to console display.setDefault( 'isShaderCompilerVerbose', true ) -- Load custom filter local kernel = require "kernel\_generator\_custom\_simplex2" --"kernel\_filter\_custom\_example" graphics.defineEffect( kernel ) -- Apply filter image.fill.effect = "generator.custom.simplex2" --[["filter.custom.example" -- image:setFillColor( 1, 0, 0 ) -- Filter parameter image.fill.effect.intensity = 1 transition.to( image.fill.effect, { intensity = 0, time = 5000, transition = easing.outExpo } ) --]] ------------------------------------------------------------