Merge code for Perlin Noise impl

This commit is contained in:
Wojtek Figat
2025-02-12 17:21:13 +01:00
parent a982e0a111
commit 6efb015169
2 changed files with 58 additions and 111 deletions

View File

@@ -71,88 +71,61 @@ namespace
rand2dTo1d(value, Float2(39.346f, 11.135f))
);
}
float PerlinNoiseImpl(const Float2& p, const Float2* rep)
{
Float4 Pxy(p.X, p.Y, p.X, p.Y);
Float4 Pi = Float4::Floor(Pxy) + Float4(0.0, 0.0, 1.0, 1.0);
Float4 Pf = Float4::Frac(Pxy) - Float4(0.0, 0.0, 1.0, 1.0);
if (rep)
{
Float4 Repxy(rep->X, rep->Y, rep->X, rep->Y);
Pi = Float4::Mod(Pi, Repxy);
}
Pi = Mod289(Pi);
Float4 ix(Pi.X, Pi.Z, Pi.X, Pi.Z);
Float4 iy(Pi.Y, Pi.Y, Pi.W, Pi.W);
Float4 fx(Pf.X, Pf.Z, Pf.X, Pf.Z);
Float4 fy(Pf.Y, Pf.Y, Pf.W, Pf.W);
Float4 i = Permute(Permute(ix) + iy);
Float4 gx = Float4::Frac(i * (1.0 / 41.0)) * 2.0 - 1.0;
Float4 gy = Float4::Abs(gx) - 0.5;
Float4 tx = Float4::Floor(gx + 0.5);
gx = gx - tx;
Float2 g00(gx.X, gy.X);
Float2 g10(gx.Y, gy.Y);
Float2 g01(gx.Z, gy.Z);
Float2 g11(gx.W, gy.W);
Float4 norm = TaylorInvSqrt(Float4(Float2::Dot(g00, g00), Float2::Dot(g01, g01), Float2::Dot(g10, g10), Float2::Dot(g11, g11)));
g00 *= norm.X;
g01 *= norm.Y;
g10 *= norm.Z;
g11 *= norm.W;
float n00 = Float2::Dot(g00, Float2(fx.X, fy.X));
float n10 = Float2::Dot(g10, Float2(fx.Y, fy.Y));
float n01 = Float2::Dot(g01, Float2(fx.Z, fy.Z));
float n11 = Float2::Dot(g11, Float2(fx.W, fy.W));
Float2 fade_xy = PerlinNoiseFade(Float2(Pf));
Float2 n_x = Float2::Lerp(Float2(n00, n01), Float2(n10, n11), fade_xy.X);
float n_xy = Math::Lerp(n_x.X, n_x.Y, fade_xy.Y);
return Math::Saturate(2.3f * n_xy);
}
}
float Noise::PerlinNoise(const Float2& p)
{
Float4 Pxy(p.X, p.Y, p.X, p.Y);
Float4 Pi = Float4::Floor(Pxy) + Float4(0.0, 0.0, 1.0, 1.0);
Float4 Pf = Float4::Frac(Pxy) - Float4(0.0, 0.0, 1.0, 1.0);
Pi = Mod289(Pi);
Float4 ix(Pi.X, Pi.Z, Pi.X, Pi.Z);
Float4 iy(Pi.Y, Pi.Y, Pi.W, Pi.W);
Float4 fx(Pf.X, Pf.Z, Pf.X, Pf.Z);
Float4 fy(Pf.Y, Pf.Y, Pf.W, Pf.W);
Float4 i = Permute(Permute(ix) + iy);
Float4 gx = Float4::Frac(i * (1.0 / 41.0)) * 2.0 - 1.0;
Float4 gy = Float4::Abs(gx) - 0.5;
Float4 tx = Float4::Floor(gx + 0.5);
gx = gx - tx;
Float2 g00(gx.X, gy.X);
Float2 g10(gx.Y, gy.Y);
Float2 g01(gx.Z, gy.Z);
Float2 g11(gx.W, gy.W);
Float4 norm = TaylorInvSqrt(Float4(Float2::Dot(g00, g00), Float2::Dot(g01, g01), Float2::Dot(g10, g10), Float2::Dot(g11, g11)));
g00 *= norm.X;
g01 *= norm.Y;
g10 *= norm.Z;
g11 *= norm.W;
float n00 = Float2::Dot(g00, Float2(fx.X, fy.X));
float n10 = Float2::Dot(g10, Float2(fx.Y, fy.Y));
float n01 = Float2::Dot(g01, Float2(fx.Z, fy.Z));
float n11 = Float2::Dot(g11, Float2(fx.W, fy.W));
Float2 fade_xy = PerlinNoiseFade(Float2(Pf));
Float2 n_x = Float2::Lerp(Float2(n00, n01), Float2(n10, n11), fade_xy.X);
float n_xy = Math::Lerp(n_x.X, n_x.Y, fade_xy.Y);
return Math::Saturate(2.3f * n_xy);
return PerlinNoiseImpl(p, nullptr);
}
float Noise::PerlinNoise(const Float2& p, const Float2& rep)
{
Float4 Pxy(p.X, p.Y, p.X, p.Y);
Float4 Repxy(rep.X, rep.Y, rep.X, rep.Y);
Float4 Pi = Float4::Floor(Pxy) + Float4(0.0, 0.0, 1.0, 1.0);
Float4 Pf = Float4::Frac(Pxy) - Float4(0.0, 0.0, 1.0, 1.0);
Pi = Float4::Mod(Pi, Repxy);
Pi = Mod289(Pi);
Float4 ix(Pi.X, Pi.Z, Pi.X, Pi.Z);
Float4 iy(Pi.Y, Pi.Y, Pi.W, Pi.W);
Float4 fx(Pf.X, Pf.Z, Pf.X, Pf.Z);
Float4 fy(Pf.Y, Pf.Y, Pf.W, Pf.W);
Float4 i = Permute(Permute(ix) + iy);
Float4 gx = Float4::Frac(i * (1.0 / 41.0)) * 2.0 - 1.0;
Float4 gy = Float4::Abs(gx) - 0.5;
Float4 tx = Float4::Floor(gx + 0.5);
gx = gx - tx;
Float2 g00(gx.X, gy.X);
Float2 g10(gx.Y, gy.Y);
Float2 g01(gx.Z, gy.Z);
Float2 g11(gx.W, gy.W);
Float4 norm = TaylorInvSqrt(Float4(Float2::Dot(g00, g00), Float2::Dot(g01, g01), Float2::Dot(g10, g10), Float2::Dot(g11, g11)));
g00 *= norm.X;
g01 *= norm.Y;
g10 *= norm.Z;
g11 *= norm.W;
float n00 = Float2::Dot(g00, Float2(fx.X, fy.X));
float n10 = Float2::Dot(g10, Float2(fx.Y, fy.Y));
float n01 = Float2::Dot(g01, Float2(fx.Z, fy.Z));
float n11 = Float2::Dot(g11, Float2(fx.W, fy.W));
Float2 fade_xy = PerlinNoiseFade(Float2(Pf));
Float2 n_x = Float2::Lerp(Float2(n00, n01), Float2(n10, n11), fade_xy.X);
float n_xy = Math::Lerp(n_x.X, n_x.Y, fade_xy.Y);
return Math::Saturate(2.3f * n_xy);
return PerlinNoiseImpl(p, &rep);
}
float Noise::SimplexNoise(const Float2& p)

View File

@@ -89,11 +89,9 @@ float3 rand3dTo3d(float3 value)
);
}
// Classic Perlin noise
float PerlinNoise(float2 p)
float PerlinNoiseImpl(float4 Pi, float4 Pf)
{
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 = Mod289(Pi);
float4 ix = Pi.xzxz;
float4 iy = Pi.yyww;
@@ -129,45 +127,21 @@ float PerlinNoise(float2 p)
return saturate(2.3 * n_xy);
}
// Classic Perlin noise
float PerlinNoise(float2 p)
{
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);
return PerlinNoiseImpl(Pi, Pf);
}
// Classic Perlin noise with periodic variant
float PerlinNoise(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 = fmod(Pi, rep.xyxy);
Pi = Mod289(Pi);
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 = PerlinNoiseFade(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 saturate(2.3 * n_xy);
return PerlinNoiseImpl(Pi, Pf);
}
// Simplex noise