74 lines
2.2 KiB
HLSL
74 lines
2.2 KiB
HLSL
float2 GradientNoiseDir(float2 x)
|
|
{
|
|
const float2 k = float2(0.3183099, 0.3678794);
|
|
x = x * k + k.yx;
|
|
return -1.0 + 2.0 * frac(16.0 * k * frac(x.x * x.y * (x.x + x.y)));
|
|
}
|
|
|
|
float GradientNoise(float2 uv)
|
|
{
|
|
float2 p = uv;
|
|
float2 i = floor(p);
|
|
float2 f = frac(p);
|
|
float2 u = f * f * (3.0 - 2.0 * f);
|
|
return lerp(lerp(dot(GradientNoiseDir(i + float2(0.0, 0.0)), f - float2(0.0, 0.0)),
|
|
dot(GradientNoiseDir(i + float2(1.0, 0.0)), f - float2(1.0, 0.0)), u.x),
|
|
lerp(dot(GradientNoiseDir(i + float2(0.0, 1.0)), f - float2(0.0, 1.0)),
|
|
dot(GradientNoiseDir(i + float2(1.0, 1.0)), f - float2(1.0, 1.0)), u.x), u.y);
|
|
}
|
|
|
|
|
|
inline float Unity_SimpleNoise_RandomValue_float (float2 uv)
|
|
{
|
|
return frac(sin(dot(uv, float2(12.9898, 78.233)))*43758.5453);
|
|
}
|
|
|
|
inline float Unity_SimpleNnoise_Interpolate_float (float a, float b, float t)
|
|
{
|
|
return (1.0-t)*a + (t*b);
|
|
}
|
|
|
|
|
|
inline float Unity_SimpleNoise_ValueNoise_float (float2 uv)
|
|
{
|
|
float2 i = floor(uv);
|
|
float2 f = frac(uv);
|
|
f = f * f * (3.0 - 2.0 * f);
|
|
|
|
uv = abs(frac(uv) - 0.5);
|
|
float2 c0 = i + float2(0.0, 0.0);
|
|
float2 c1 = i + float2(1.0, 0.0);
|
|
float2 c2 = i + float2(0.0, 1.0);
|
|
float2 c3 = i + float2(1.0, 1.0);
|
|
float r0 = Unity_SimpleNoise_RandomValue_float(c0);
|
|
float r1 = Unity_SimpleNoise_RandomValue_float(c1);
|
|
float r2 = Unity_SimpleNoise_RandomValue_float(c2);
|
|
float r3 = Unity_SimpleNoise_RandomValue_float(c3);
|
|
|
|
float bottomOfGrid = Unity_SimpleNnoise_Interpolate_float(r0, r1, f.x);
|
|
float topOfGrid = Unity_SimpleNnoise_Interpolate_float(r2, r3, f.x);
|
|
float t = Unity_SimpleNnoise_Interpolate_float(bottomOfGrid, topOfGrid, f.y);
|
|
return t;
|
|
}
|
|
|
|
float SimplexNoise(float2 uv)
|
|
{
|
|
float t = 0.0;
|
|
|
|
uv *= 2;
|
|
|
|
float freq = pow(2.0, float(0));
|
|
float amp = pow(0.5, float(3-0));
|
|
t += Unity_SimpleNoise_ValueNoise_float(float2(uv.x/freq, uv.y/freq))*amp;
|
|
|
|
freq = pow(2.0, float(1));
|
|
amp = pow(0.5, float(3-1));
|
|
t += Unity_SimpleNoise_ValueNoise_float(float2(uv.x/freq, uv.y/freq))*amp;
|
|
|
|
freq = pow(2.0, float(2));
|
|
amp = pow(0.5, float(3-2));
|
|
t += Unity_SimpleNoise_ValueNoise_float(float2(uv.x/freq, uv.y/freq))*amp;
|
|
|
|
return t;
|
|
}
|