[Bf-blender-cvs] [48e2a15160d] blender-v3.0-release: Fix T77681, T92634: noise texture artifacts with high detail

Brecht Van Lommel noreply at git.blender.org
Tue Nov 2 19:33:08 CET 2021


Commit: 48e2a15160d276c8080cd8d4f6dc0ba752dbb410
Author: Brecht Van Lommel
Date:   Tue Nov 2 18:27:54 2021 +0100
Branches: blender-v3.0-release
https://developer.blender.org/rB48e2a15160d276c8080cd8d4f6dc0ba752dbb410

Fix T77681, T92634: noise texture artifacts with high detail

We run into float precision issues here, clamp the number of octaves to
one less, which has little to no visual difference. This was empirically
determined to work up to 16 before, but with additional inputs like
roughness only 15 appears to work.

Also adds misisng clamp for the geometry nodes implementation.

===================================================================

M	intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
M	intern/cycles/kernel/osl/shaders/node_noise.h
M	intern/cycles/kernel/svm/fractal_noise.h
M	intern/cycles/kernel/svm/musgrave.h
M	source/blender/blenlib/intern/noise.cc
M	source/blender/gpu/shaders/material/gpu_shader_material_fractal_noise.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_tex_musgrave.glsl
M	source/blender/nodes/shader/nodes/node_shader_tex_musgrave.cc
M	source/blender/nodes/shader/nodes/node_shader_tex_noise.cc
M	source/blender/nodes/shader/nodes/node_shader_tex_wave.cc

===================================================================

diff --git a/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl b/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
index 0e71ce74c29..6a688d654c9 100644
--- a/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
+++ b/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
@@ -697,7 +697,7 @@ shader node_musgrave_texture(
     output float Fac = 0.0)
 {
   float dimension = max(Dimension, 1e-5);
-  float octaves = clamp(Detail, 0.0, 16.0);
+  float octaves = clamp(Detail, 0.0, 15.0);
   float lacunarity = max(Lacunarity, 1e-5);
 
   vector3 s = Vector;
diff --git a/intern/cycles/kernel/osl/shaders/node_noise.h b/intern/cycles/kernel/osl/shaders/node_noise.h
index ab4cd7792cc..e8a71032171 100644
--- a/intern/cycles/kernel/osl/shaders/node_noise.h
+++ b/intern/cycles/kernel/osl/shaders/node_noise.h
@@ -90,7 +90,7 @@ float fractal_noise(float p, float details, float roughness)
   float amp = 1.0;
   float maxamp = 0.0;
   float sum = 0.0;
-  float octaves = clamp(details, 0.0, 16.0);
+  float octaves = clamp(details, 0.0, 15.0);
   int n = (int)octaves;
   for (int i = 0; i <= n; i++) {
     float t = safe_noise(fscale * p);
@@ -119,7 +119,7 @@ float fractal_noise(vector2 p, float details, float roughness)
   float amp = 1.0;
   float maxamp = 0.0;
   float sum = 0.0;
-  float octaves = clamp(details, 0.0, 16.0);
+  float octaves = clamp(details, 0.0, 15.0);
   int n = (int)octaves;
   for (int i = 0; i <= n; i++) {
     float t = safe_noise(fscale * p);
@@ -148,7 +148,7 @@ float fractal_noise(vector3 p, float details, float roughness)
   float amp = 1.0;
   float maxamp = 0.0;
   float sum = 0.0;
-  float octaves = clamp(details, 0.0, 16.0);
+  float octaves = clamp(details, 0.0, 15.0);
   int n = (int)octaves;
   for (int i = 0; i <= n; i++) {
     float t = safe_noise(fscale * p);
@@ -177,7 +177,7 @@ float fractal_noise(vector4 p, float details, float roughness)
   float amp = 1.0;
   float maxamp = 0.0;
   float sum = 0.0;
-  float octaves = clamp(details, 0.0, 16.0);
+  float octaves = clamp(details, 0.0, 15.0);
   int n = (int)octaves;
   for (int i = 0; i <= n; i++) {
     float t = safe_noise(fscale * p);
diff --git a/intern/cycles/kernel/svm/fractal_noise.h b/intern/cycles/kernel/svm/fractal_noise.h
index b955d626dde..8256a24c751 100644
--- a/intern/cycles/kernel/svm/fractal_noise.h
+++ b/intern/cycles/kernel/svm/fractal_noise.h
@@ -27,7 +27,7 @@ ccl_device_noinline float fractal_noise_1d(float p, float octaves, float roughne
   float amp = 1.0f;
   float maxamp = 0.0f;
   float sum = 0.0f;
-  octaves = clamp(octaves, 0.0f, 16.0f);
+  octaves = clamp(octaves, 0.0f, 15.0f);
   int n = float_to_int(octaves);
   for (int i = 0; i <= n; i++) {
     float t = noise_1d(fscale * p);
@@ -56,7 +56,7 @@ ccl_device_noinline float fractal_noise_2d(float2 p, float octaves, float roughn
   float amp = 1.0f;
   float maxamp = 0.0f;
   float sum = 0.0f;
-  octaves = clamp(octaves, 0.0f, 16.0f);
+  octaves = clamp(octaves, 0.0f, 15.0f);
   int n = float_to_int(octaves);
   for (int i = 0; i <= n; i++) {
     float t = noise_2d(fscale * p);
@@ -85,7 +85,7 @@ ccl_device_noinline float fractal_noise_3d(float3 p, float octaves, float roughn
   float amp = 1.0f;
   float maxamp = 0.0f;
   float sum = 0.0f;
-  octaves = clamp(octaves, 0.0f, 16.0f);
+  octaves = clamp(octaves, 0.0f, 15.0f);
   int n = float_to_int(octaves);
   for (int i = 0; i <= n; i++) {
     float t = noise_3d(fscale * p);
@@ -114,7 +114,7 @@ ccl_device_noinline float fractal_noise_4d(float4 p, float octaves, float roughn
   float amp = 1.0f;
   float maxamp = 0.0f;
   float sum = 0.0f;
-  octaves = clamp(octaves, 0.0f, 16.0f);
+  octaves = clamp(octaves, 0.0f, 15.0f);
   int n = float_to_int(octaves);
   for (int i = 0; i <= n; i++) {
     float t = noise_4d(fscale * p);
diff --git a/intern/cycles/kernel/svm/musgrave.h b/intern/cycles/kernel/svm/musgrave.h
index 85e32eee638..a37ca9eb8eb 100644
--- a/intern/cycles/kernel/svm/musgrave.h
+++ b/intern/cycles/kernel/svm/musgrave.h
@@ -737,7 +737,7 @@ ccl_device_noinline int svm_node_tex_musgrave(KernelGlobals kg,
   float gain = stack_load_float_default(stack, gain_stack_offset, defaults2.z);
 
   dimension = fmaxf(dimension, 1e-5f);
-  detail = clamp(detail, 0.0f, 16.0f);
+  detail = clamp(detail, 0.0f, 15.0f);
   lacunarity = fmaxf(lacunarity, 1e-5f);
 
   float fac;
diff --git a/source/blender/blenlib/intern/noise.cc b/source/blender/blenlib/intern/noise.cc
index bc78ded63a0..959385bff31 100644
--- a/source/blender/blenlib/intern/noise.cc
+++ b/source/blender/blenlib/intern/noise.cc
@@ -582,7 +582,7 @@ template<typename T> float perlin_fractal_template(T position, float octaves, fl
   float amp = 1.0f;
   float maxamp = 0.0f;
   float sum = 0.0f;
-  octaves = CLAMPIS(octaves, 0.0f, 16.0f);
+  octaves = CLAMPIS(octaves, 0.0f, 15.0f);
   int n = static_cast<int>(octaves);
   for (int i = 0; i <= n; i++) {
     float t = perlin(fscale * position);
@@ -771,12 +771,16 @@ float3 perlin_float3_fractal_distorted(float4 position,
  * from "Texturing and Modelling: A procedural approach"
  */
 
-float musgrave_fBm(const float co, const float H, const float lacunarity, const float octaves)
+float musgrave_fBm(const float co,
+                   const float H,
+                   const float lacunarity,
+                   const float octaves_unclamped)
 {
   float p = co;
   float value = 0.0f;
   float pwr = 1.0f;
   const float pwHL = powf(lacunarity, -H);
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
   for (int i = 0; i < (int)octaves; i++) {
     value += perlin_signed(p) * pwr;
@@ -802,12 +806,13 @@ float musgrave_fBm(const float co, const float H, const float lacunarity, const
 float musgrave_multi_fractal(const float co,
                              const float H,
                              const float lacunarity,
-                             const float octaves)
+                             const float octaves_unclamped)
 {
   float p = co;
   float value = 1.0f;
   float pwr = 1.0f;
   const float pwHL = powf(lacunarity, -H);
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
   for (int i = 0; i < (int)octaves; i++) {
     value *= (pwr * perlin_signed(p) + 1.0f);
@@ -831,12 +836,16 @@ float musgrave_multi_fractal(const float co,
  * offset: raises the terrain from `sea level'
  */
 
-float musgrave_hetero_terrain(
-    const float co, const float H, const float lacunarity, const float octaves, const float offset)
+float musgrave_hetero_terrain(const float co,
+                              const float H,
+                              const float lacunarity,
+                              const float octaves_unclamped,
+                              const float offset)
 {
   float p = co;
   const float pwHL = powf(lacunarity, -H);
   float pwr = pwHL;
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
   /* first unscaled octave of function; later octaves are scaled */
   float value = offset + perlin_signed(p);
@@ -869,7 +878,7 @@ float musgrave_hetero_terrain(
 float musgrave_hybrid_multi_fractal(const float co,
                                     const float H,
                                     const float lacunarity,
-                                    const float octaves,
+                                    const float octaves_unclamped,
                                     const float offset,
                                     const float gain)
 {
@@ -881,6 +890,8 @@ float musgrave_hybrid_multi_fractal(const float co,
   float weight = gain * value;
   p *= lacunarity;
 
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
+
   for (int i = 1; (weight > 0.001f) && (i < (int)octaves); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
@@ -912,7 +923,7 @@ float musgrave_hybrid_multi_fractal(const float co,
 float musgrave_ridged_multi_fractal(const float co,
                                     const float H,
                                     const float lacunarity,
-                                    const float octaves,
+                                    const float octaves_unclamped,
                                     const float offset,
                                     const float gain)
 {
@@ -925,6 +936,8 @@ float musgrave_ridged_multi_fractal(const float co,
   float value = signal;
   float weight = 1.0f;
 
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
+
   for (int i = 1; i < (int)octaves; i++) {
     p *= lacunarity;
     weight = CLAMPIS(signal * gain, 0.0f, 1.0f);
@@ -947,12 +960,16 @@ float musgrave_ridged_multi_fractal(const float co,
  * from "Texturing and Modelling: A procedural approach"
  */
 
-float musgrave_fBm(const float2 co, const float H, const float lacunarity, const float octaves)
+float musgrave_fBm(const float2 co,
+                   const float H,
+                   const float lacunarity,
+                   const float octaves_unclamped)
 {
   float2 p = co;
   float value = 0.0f;
   float pwr = 1.0f;
   const float pwHL = powf(lacunarity, -H);
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
   for (int i = 0; i < (int)octaves; i++) {
     value += perlin_signed(p) * pwr;
@@ -978,12 +995,13 @@ float musgrave_fBm(const float2 co, const float H, const float lacunarity, const
 float musgrave_multi_fractal(const float2 co,
                              const float H,
                              const float lacunarity,
-                             const float octaves)
+                             const float octaves_unclamped)
 {
   float2 p = co;
   float value = 1.0f;
   float pwr = 1.0f;
   const float pwHL = powf(lacunarity, -H);
+  const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
   for (int i = 0; i < (int)octaves; i++) {
     value *= (pwr * perlin_signed(p) + 1.0f);
@@ -1010,7 +1028,7 @@ float musgrave_multi_fractal(const float2 co,
 float musgrave_hetero_terrain(const float2 co,
                               const float H,
                               const float lacunarity,
-                              const float octaves,
+                              const float octaves_unclamped,
                            

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list