123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- float3 mod(float3 x, float3 y)
- {
- return x - y * floor(x / y);
- }
- float4 mod(float4 x, float4 y)
- {
- return x - y * floor(x / y);
- }
- float3 mod289(float3 x)
- {
- return x - floor(x / 289.0) * 289.0;
- }
- float4 mod289(float4 x)
- {
- return x - floor(x * (1.0 / 289.0)) * 289.0;
- }
- float4 permute(float4 x)
- {
- return mod289(((x*34.0) + 1.0)*x);
- }
- float3 fade(float3 t) {
- return t*t*t*(t*(t*6.0 - 15.0) + 10.0);
- }
- float4 taylorInvSqrt(float4 r)
- {
- return 1.79284291400159 - 0.85373472095314 * r;
- }
- float2 fade(float2 t) {
- return t*t*t*(t*(t*6.0 - 15.0) + 10.0);
- }
-
- // Classic Perlin noise, periodic variant
- float penoise(float2 P, float2 rep)
- {
- float4 Pi = floor(P.xyxy) + float4(0.0, 0.0, 1.0, 1.0);
- float4 Pf = frac(P.xyxy) - float4(0.0, 0.0, 1.0, 1.0);
- Pi = mod(Pi, rep.xyxy); // To create noise with explicit period
- Pi = mod289(Pi); // To avoid truncation effects in permutation
- float4 ix = Pi.xzxz;
- float4 iy = Pi.yyww;
- float4 fx = Pf.xzxz;
- float4 fy = Pf.yyww;
- float4 i = permute(permute(ix) + iy);
- float4 gx = frac(i * (1.0 / 41.0)) * 2.0 - 1.0;
- float4 gy = abs(gx) - 0.5;
- float4 tx = floor(gx + 0.5);
- gx = gx - tx;
- float2 g00 = float2(gx.x, gy.x);
- float2 g10 = float2(gx.y, gy.y);
- float2 g01 = float2(gx.z, gy.z);
- float2 g11 = float2(gx.w, gy.w);
- float4 norm = taylorInvSqrt(float4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
- g00 *= norm.x;
- g01 *= norm.y;
- g10 *= norm.z;
- g11 *= norm.w;
- float n00 = dot(g00, float2(fx.x, fy.x));
- float n10 = dot(g10, float2(fx.y, fy.y));
- float n01 = dot(g01, float2(fx.z, fy.z));
- float n11 = dot(g11, float2(fx.w, fy.w));
- float2 fade_xy = fade(Pf.xy);
- float2 n_x = lerp(float2(n00, n01), float2(n10, n11), fade_xy.x);
- float n_xy = lerp(n_x.x, n_x.y, fade_xy.y);
- return 2.3 * n_xy;
- }
- float CalculatePerlinTileing5(float2 p, float2 rep)
- {
- float2 xy = p;
- float amplitude_factor = 0.5;
- float frequency_factor = 1.0;
- float a = 1.0;
- float perlin_value = 0.0;
- perlin_value += a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 1);
- perlin_value -= a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 1);
- perlin_value -= a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 1);
- perlin_value -= a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 1);
- perlin_value += a * penoise(xy, rep).r;
- return perlin_value;
- }
- float CalculatePerlinTileing5OLD(float2 p, float2 rep)
- {
- float2 xy = p;
- float amplitude_factor = 0.5;
- float frequency_factor = 2.0;
- float a = 1.0;
- float perlin_value = 0.0;
- perlin_value += a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 0.12);
- perlin_value -= a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 0.03);
- perlin_value -= a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 0.01);
- perlin_value -= a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 0.01);
- perlin_value += a * penoise(xy, rep).r;
- return perlin_value;
- }
- float CalculatePerlinTileing(float2 p, float2 rep)
- {
- float2 xy = p;
- float amplitude_factor = 0.5;
- float frequency_factor = 1.0;
- float a = 1.0;
- float perlin_value = 0.0;
- perlin_value += a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 1);
- perlin_value += a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 1);
- perlin_value += a * penoise(xy, rep).r; a *= amplitude_factor; xy *= (frequency_factor + 2);
- perlin_value -= a * penoise(xy, rep).r;
- return perlin_value;
- }
- ///////////WORLEY
- float set_range(float value, float low, float high)
- {
- return saturate((value - low)/(high - low));
- }
- float dilate_perlin_worley(float p, float w, float x)
- {
- float curve = 0.75;
- if (x < 0.5)
- {
- x = x / 0.5;
- float n = p + w * x;
- return n * lerp(1, 0.5, pow(x, curve));
- }
- else
- {
- x = (x - 0.5) / 0.5;
- float n = w + p * (1.0 - x);
- return n * lerp(0.5, 1.0, pow(x, 1.0 / curve));
- }
- }
- #define UI0 1597334673
- #define UI1 3812015801
- #define UI2 uint2(UI0, UI1)
- #define UI3 uint3(UI0, UI1, 2798796415)
- #define UIF (1.0 / float(0xffffffffU))
- float3 hash33(float3 p)
- {
- uint3 q = uint3(int3(p)) * UI3;
- q = (q.x ^ q.y ^ q.z)*UI3;
- return -1. + 2. * float3(q) * UIF;
- }
- float2 hash22(float2 p)
- {
- uint2 q = uint2(int2(p)) * UI3.xy;
- q = (q.x ^ q.y)*UI3.xy;
- return -1. + 2. * float2(q) * UIF;
- }
- // Gradient noise by iq (modified to be tileable)
- float gradientNoise(float3 x, float freq)
- {
- // grid
- float3 p = floor(x);
- float3 w = frac(x);
-
- // quintic interpolant
- float3 u = w * w * w * (w * (w * 6. - 15.) + 10.);
-
- // gradients
- float3 ga = hash33(fmod(p + float3(0., 0., 0.), freq));
- float3 gb = hash33(fmod(p + float3(1., 0., 0.), freq));
- float3 gc = hash33(fmod(p + float3(0., 1., 0.), freq));
- float3 gd = hash33(fmod(p + float3(1., 1., 0.), freq));
- float3 ge = hash33(fmod(p + float3(0., 0., 1.), freq));
- float3 gf = hash33(fmod(p + float3(1., 0., 1.), freq));
- float3 gg = hash33(fmod(p + float3(0., 1., 1.), freq));
- float3 gh = hash33(fmod(p + float3(1., 1., 1.), freq));
-
- // projections
- float va = dot(ga, w - float3(0., 0., 0.));
- float vb = dot(gb, w - float3(1., 0., 0.));
- float vc = dot(gc, w - float3(0., 1., 0.));
- float vd = dot(gd, w - float3(1., 1., 0.));
- float ve = dot(ge, w - float3(0., 0., 1.));
- float vf = dot(gf, w - float3(1., 0., 1.));
- float vg = dot(gg, w - float3(0., 1., 1.));
- float vh = dot(gh, w - float3(1., 1., 1.));
-
- // interpolation
- return va +
- u.x * (vb - va) +
- u.y * (vc - va) +
- u.z * (ve - va) +
- u.x * u.y * (va - vb - vc + vd) +
- u.y * u.z * (va - vc - ve + vg) +
- u.z * u.x * (va - vb - ve + vf) +
- u.x * u.y * u.z * (-va + vb + vc - vd + ve - vf - vg + vh);
- }
- // Tileable 3D worley noise
- float worleyNoise(float3 uv, float freq)
- {
- float3 id = floor(uv);
- float3 p = frac(uv);
-
- float minDist = 10000.;
- for (float x = -1.; x <= 1.; ++x)
- {
- for(float y = -1.; y <= 1.; ++y)
- {
- for(float z = -1.; z <= 1.; ++z)
- {
- float3 offset = float3(x, y, z);
- float3 h = hash33(fmod(id + offset, float3(freq,freq,freq))) * .5 + .5;
- h += offset;
- float3 d = p - h;
- minDist = min(minDist, dot(d, d));
- }
- }
- }
-
- // inverted worley noise
- return 1. - minDist;
- }
- float worleyFbm(float3 p, float freq)
- {
- return worleyNoise(p*freq, freq) * .625 +
- worleyNoise(p*freq*2., freq*2.) * .25 +
- worleyNoise(p*freq*4., freq*4.) * .125;
- }
- float worleyNoise2D(float2 uv, float freq)
- {
- float2 id = floor(uv);
- float2 p = frac(uv);
-
- float minDist = 10000.;
- for (float x = -1.; x <= 1.; ++x)
- {
- for(float y = -1.; y <= 1.; ++y)
- {
- float2 offset = float2(x, y);
- float2 h = hash22(fmod(id + offset, float2(freq,freq))) * .5 + .5;
- h += offset;
- float2 d = p - h;
- minDist = min(minDist, dot(d, d));
- }
- }
-
- // inverted worley noise
- return 1. - minDist;
- }
- float worleyFbm2DFiller(float2 p, float freq)
- {
- return worleyNoise2D(p*freq, freq) * .625 + worleyNoise2D(p*freq*2., freq*2.) * .225 + worleyNoise2D(p*freq*4., freq*4.) * .125;
- }
- float worleyFbm2D(float2 p, float freq)
- {
- return worleyNoise2D(p*freq, freq) * .625 - worleyNoise2D(p*freq*2., freq*2.) * .225 + worleyNoise2D(p*freq*4., freq*4.) * .125;
- }
- float worley2(float2 p, float freq)
- {
- float fbm = worleyFbm2D(p*freq * 4, 4) * 1.2;
- float worl = worleyNoise2D(p*freq*2, 1) * .425 - worleyNoise2D(p*freq*2, 1) * .225;
- return saturate(fbm - worl);
- }
|