From c146e156ec3f416a62397f9f2bc7a34912bab487 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 12 Feb 2025 22:13:09 +0100 Subject: [PATCH] Fix perlin and simplex noises to return normalized value to range 0-1 #3154 --- Source/Engine/Utilities/Noise.cpp | 4 ++-- Source/Engine/Utilities/PerlinNoise.cs | 9 +++------ Source/Shaders/Noise.hlsl | 5 ++--- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Source/Engine/Utilities/Noise.cpp b/Source/Engine/Utilities/Noise.cpp index 93ed69d21..4b1de24f5 100644 --- a/Source/Engine/Utilities/Noise.cpp +++ b/Source/Engine/Utilities/Noise.cpp @@ -114,7 +114,7 @@ namespace 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 Math::Saturate(n_xy * 2.136f + 0.5f); // Rescale to [0;1] } } @@ -169,7 +169,7 @@ float Noise::SimplexNoise(const Float2& p) float gx = a0.X * x0.X + h.X * x0.Y; Float2 gyz = Float2(a0.Y, a0.Z) * Float2(x12.X, x12.Z) + Float2(h.Y, h.Z) * Float2(x12.Y, x12.W); Float3 g(gx, gyz.X, gyz.Y); - return Math::Saturate(130.0f * Float3::Dot(m, g)); + return Math::Saturate(Float3::Dot(m, g) * 71.428f + 0.5f); // Rescale to [0;1] } Float2 Noise::WorleyNoise(const Float2& p) diff --git a/Source/Engine/Utilities/PerlinNoise.cs b/Source/Engine/Utilities/PerlinNoise.cs index 096e8c810..f932b8c90 100644 --- a/Source/Engine/Utilities/PerlinNoise.cs +++ b/Source/Engine/Utilities/PerlinNoise.cs @@ -58,15 +58,13 @@ namespace FlaxEngine.Utilities /// The x coordinate. /// The y coordinate. /// The noise value. - public float Sample(int x, int y) + public float Sample(float x, float y) { float noise = 0.0f; - if (NoiseScale > Mathf.Epsilon) { - x = Math.Abs(x); - y = Math.Abs(y); - + x = Mathf.Abs(x); + y = Mathf.Abs(y); for (int octave = 0; octave < Octaves; octave++) { float octaveShift = 1 << octave; @@ -74,7 +72,6 @@ namespace FlaxEngine.Utilities noise += PerlinNoise2D(x * octaveScale, y * octaveScale) / octaveShift; } } - return Base + noise * NoiseAmount; } diff --git a/Source/Shaders/Noise.hlsl b/Source/Shaders/Noise.hlsl index 514dc29c2..a421b2503 100644 --- a/Source/Shaders/Noise.hlsl +++ b/Source/Shaders/Noise.hlsl @@ -89,7 +89,6 @@ float3 rand3dTo3d(float3 value) ); } - float PerlinNoiseImpl(float4 Pi, float4 Pf) { Pi = Mod289(Pi); @@ -124,7 +123,7 @@ float PerlinNoiseImpl(float4 Pi, float4 Pf) 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 saturate(n_xy * 2.136f + 0.5f); // Rescale to [0;1] } // Classic Perlin noise @@ -183,7 +182,7 @@ float SimplexNoise(float2 p) float gx = a0.x * x0.x + h.x * x0.y; float2 gyz = a0.yz * x12.xz + h.yz * x12.yw; float3 g = float3(gx, gyz); - return saturate(130.0f * dot(m, g)); + return saturate(dot(m, g) * 71.428f + 0.5f); // Rescale to [0;1] } // Worley noise (cellar noise with standard 3x3 search window for F1 and F2 values)