Last active
May 5, 2024 01:07
-
-
Save dario-zubovic/e8c4b1f6619b69ba2090123a6e1c2584 to your computer and use it in GitHub Desktop.
HLSL Simplex noise 2D
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// based on https://github.com/keijiro/NoiseShader/blob/master/Assets/GLSL/SimplexNoise2D.glsl | |
// which itself is modification of https://github.com/ashima/webgl-noise/blob/master/src/noise3D.glsl | |
// | |
// License : Copyright (C) 2011 Ashima Arts. All rights reserved. | |
// Distributed under the MIT License. See LICENSE file. | |
// https://github.com/keijiro/NoiseShader/blob/master/LICENSE | |
// https://github.com/ashima/webgl-noise | |
// https://github.com/stegu/webgl-noise | |
float3 mod289(float3 x) { | |
return x - floor(x * (1.0 / 289.0)) * 289.0; | |
} | |
float2 mod289(float2 x) { | |
return x - floor(x * (1.0 / 289.0)) * 289.0; | |
} | |
float3 permute(float3 x) { | |
return mod289((x * 34.0 + 1.0) * x); | |
} | |
float3 taylorInvSqrt(float3 r) { | |
return 1.79284291400159 - 0.85373472095314 * r; | |
} | |
// output noise is in range [-1, 1] | |
float snoise(float2 v) { | |
const float4 C = float4(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 | |
float2 i = floor(v + dot(v, C.yy)); | |
float2 x0 = v - i + dot(i, C.xx); | |
// Other corners | |
float2 i1; | |
i1.x = step(x0.y, x0.x); | |
i1.y = 1.0 - i1.x; | |
// x1 = x0 - i1 + 1.0 * C.xx; | |
// x2 = x0 - 1.0 + 2.0 * C.xx; | |
float2 x1 = x0 + C.xx - i1; | |
float2 x2 = x0 + C.zz; | |
// Permutations | |
i = mod289(i); // Avoid truncation effects in permutation | |
float3 p = | |
permute(permute(i.y + float3(0.0, i1.y, 1.0)) | |
+ i.x + float3(0.0, i1.x, 1.0)); | |
float3 m = max(0.5 - float3(dot(x0, x0), dot(x1, x1), dot(x2, x2)), 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) | |
float3 x = 2.0 * frac(p * C.www) - 1.0; | |
float3 h = abs(x) - 0.5; | |
float3 ox = floor(x + 0.5); | |
float3 a0 = x - ox; | |
// Normalise gradients implicitly by scaling m | |
m *= taylorInvSqrt(a0 * a0 + h * h); | |
// Compute final noise value at P | |
float3 g = float3( | |
a0.x * x0.x + h.x * x0.y, | |
a0.y * x1.x + h.y * x1.y, | |
g.z = a0.z * x2.x + h.z * x2.y | |
); | |
return 130.0 * dot(m, g); | |
} | |
float snoise01(float2 v) { | |
return snoise(v) * 0.5 + 0.5; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You should be able to multiply the value you pass into
snoise()
to change the scalee.g.