The Shader Editor is more stable in beta 1.5(8), but I find that it is still not stable and crashes out of Codea from time to time.

I have been experimenting with noise in the light of this github respository.

Lua:

```
--
-- Noise GLSL
--
-- Shader makes use of:
-- Array and textureless GLSL 2D simplex noise function.
-- Author : Ian McEwan, Ashima Arts.
-- https://github.com/ashima/webgl-noise
function setup()
parameter.number("freq", 1, 10, 5)
parameter.number("speed", 0, 1, 0.1)
parameter.number("threshold", 0, 1, 0.5)
origin = vec2()
velDir = 0
dVelDir = 0.1
twoPi = 2 * math.pi
m = mesh()
m:addRect(WIDTH/2, HEIGHT/2, WIDTH, HEIGHT)
m.shader = shader("Documents:Noise")
end
function draw()
velDir = velDir + ((math.random() * 2 - 1) * dVelDir) % twoPi
local vel = vec2(math.cos(velDir), math.sin(velDir)) * speed
origin = origin + vel
m.shader.origin = origin
m.shader.freq = freq
m.shader.threshold = threshold
m:draw()
end
```

Vertex shader:

```
//
// Vertex shader: Noise
//
uniform mat4 modelViewProjection;
attribute vec4 position;
attribute vec2 texCoord;
varying highp vec2 vTexCoord;
void main() {
vTexCoord = texCoord;
gl_Position = modelViewProjection * position;
}
```

Fragment shader:

```
//
// Fragment shader: Noise
//
precision highp float;
uniform vec2 origin;
uniform float freq;
uniform float threshold;
varying highp vec2 vTexCoord;
// ---------------------------------------------------------------
// Array and textureless GLSL 2D simplex noise function.
// Author : Ian McEwan, Ashima Arts.
// https://github.com/ashima/webgl-noise
// ---------------------------------------------------------------
// Copyright (C) 2011 Ashima Arts. All rights reserved.
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
vec3 mod289(vec3 x) {return x - floor(x / 289.0) * 289.0;}
vec2 mod289(vec2 x) {return x - floor(x / 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
vec2 i = floor(v + dot(v, C.yy));
vec2 x0 = v - i + dot(i, C.xx);
vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
vec4 x12 = x0.xyxy + C.xxzz;
x12.xy -= i1;
i = mod289(i);
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;
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;
m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);
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);
}
// ---------------------------------------------------------------
void main() {
vec2 p = vTexCoord * freq + origin;
float n = (snoise(p) + 1.0) / 2.0;
n = (n > threshold) ? (n - threshold) / (1.0 - threshold) : 0.0;
gl_FragColor = vec4(n, n, n, 1.0);
}
```