[Bf-blender-cvs] [763cafc2b10] blender-v3.3-release: Fix T55284: error in Hybrid MultiFractal Musgrave texture

Luis Pereira noreply at git.blender.org
Fri Aug 26 17:28:16 CEST 2022


Commit: 763cafc2b101d3258cb62b9a966b6d7e7629eb85
Author: Luis Pereira
Date:   Fri Aug 26 15:30:59 2022 +0200
Branches: blender-v3.3-release
https://developer.blender.org/rB763cafc2b101d3258cb62b9a966b6d7e7629eb85

Fix T55284: error in Hybrid MultiFractal Musgrave texture

The calculation was revised to address two issues:
* Discontinuities occurring when detail was a non-integer greater than 2.
* Levels of detail in the interval [0,1) repeating the levels of detail in
  the interval [1,2).

This fixes Cycles, Eevee and geometry nodes.

Differential Revision: https://developer.blender.org/D15785

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

M	intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
M	intern/cycles/kernel/svm/musgrave.h
M	source/blender/blenlib/intern/noise.cc
M	source/blender/gpu/shaders/material/gpu_shader_material_tex_musgrave.glsl

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

diff --git a/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl b/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
index 391be8c14d7..fdda1ba9cd1 100644
--- a/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
+++ b/intern/cycles/kernel/osl/shaders/node_musgrave_texture.osl
@@ -114,13 +114,12 @@ float noise_musgrave_hybrid_multi_fractal_1d(
 {
   float p = co;
   float pwHL = pow(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = safe_snoise(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0;
+  float value = 0.0;
+  float weight = 1.0;
 
-  for (int i = 1; (weight > 0.001) && (i < (int)octaves); i++) {
+  for (int i = 0; (weight > 0.001) && (i < (int)octaves); i++) {
     if (weight > 1.0) {
       weight = 1.0;
     }
@@ -133,8 +132,12 @@ float noise_musgrave_hybrid_multi_fractal_1d(
   }
 
   float rmd = octaves - floor(octaves);
-  if (rmd != 0.0) {
-    value += rmd * ((safe_snoise(p) + offset) * pwr);
+  if ((rmd != 0.0) && (weight > 0.001)) {
+    if (weight > 1.0) {
+      weight = 1.0;
+    }
+    float signal = (safe_snoise(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -279,13 +282,12 @@ float noise_musgrave_hybrid_multi_fractal_2d(
 {
   vector2 p = co;
   float pwHL = pow(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = safe_snoise(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0;
+  float value = 0.0;
+  float weight = 1.0;
 
-  for (int i = 1; (weight > 0.001) && (i < (int)octaves); i++) {
+  for (int i = 0; (weight > 0.001) && (i < (int)octaves); i++) {
     if (weight > 1.0) {
       weight = 1.0;
     }
@@ -298,8 +300,12 @@ float noise_musgrave_hybrid_multi_fractal_2d(
   }
 
   float rmd = octaves - floor(octaves);
-  if (rmd != 0.0) {
-    value += rmd * ((safe_snoise(p) + offset) * pwr);
+  if ((rmd != 0.0) && (weight > 0.001)) {
+    if (weight > 1.0) {
+      weight = 1.0;
+    }
+    float signal = (safe_snoise(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -444,13 +450,12 @@ float noise_musgrave_hybrid_multi_fractal_3d(
 {
   vector3 p = co;
   float pwHL = pow(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = safe_snoise(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0;
+  float value = 0.0;
+  float weight = 1.0;
 
-  for (int i = 1; (weight > 0.001) && (i < (int)octaves); i++) {
+  for (int i = 0; (weight > 0.001) && (i < (int)octaves); i++) {
     if (weight > 1.0) {
       weight = 1.0;
     }
@@ -463,8 +468,12 @@ float noise_musgrave_hybrid_multi_fractal_3d(
   }
 
   float rmd = octaves - floor(octaves);
-  if (rmd != 0.0) {
-    value += rmd * ((safe_snoise(p) + offset) * pwr);
+  if ((rmd != 0.0) && (weight > 0.001)) {
+    if (weight > 1.0) {
+      weight = 1.0;
+    }
+    float signal = (safe_snoise(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -609,13 +618,12 @@ float noise_musgrave_hybrid_multi_fractal_4d(
 {
   vector4 p = co;
   float pwHL = pow(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = safe_snoise(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0;
+  float value = 0.0;
+  float weight = 1.0;
 
-  for (int i = 1; (weight > 0.001) && (i < (int)octaves); i++) {
+  for (int i = 0; (weight > 0.001) && (i < (int)octaves); i++) {
     if (weight > 1.0) {
       weight = 1.0;
     }
@@ -628,8 +636,12 @@ float noise_musgrave_hybrid_multi_fractal_4d(
   }
 
   float rmd = octaves - floor(octaves);
-  if (rmd != 0.0) {
-    value += rmd * ((safe_snoise(p) + offset) * pwr);
+  if ((rmd != 0.0) && (weight > 0.001)) {
+    if (weight > 1.0) {
+      weight = 1.0;
+    }
+    float signal = (safe_snoise(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
diff --git a/intern/cycles/kernel/svm/musgrave.h b/intern/cycles/kernel/svm/musgrave.h
index 521c96d9f37..e88da8a17f7 100644
--- a/intern/cycles/kernel/svm/musgrave.h
+++ b/intern/cycles/kernel/svm/musgrave.h
@@ -119,13 +119,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_1d(
 {
   float p = co;
   float pwHL = powf(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = snoise_1d(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0f;
+  float value = 0.0f;
+  float weight = 1.0f;
 
-  for (int i = 1; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
+  for (int i = 0; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
     }
@@ -138,8 +137,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_1d(
   }
 
   float rmd = octaves - floorf(octaves);
-  if (rmd != 0.0f) {
-    value += rmd * ((snoise_1d(p) + offset) * pwr);
+  if ((rmd != 0.0f) && (weight > 0.001f)) {
+    if (weight > 1.0f) {
+      weight = 1.0f;
+    }
+    float signal = (snoise_1d(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -290,13 +293,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_2d(
 {
   float2 p = co;
   float pwHL = powf(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = snoise_2d(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0f;
+  float value = 0.0f;
+  float weight = 1.0f;
 
-  for (int i = 1; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
+  for (int i = 0; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
     }
@@ -309,8 +311,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_2d(
   }
 
   float rmd = octaves - floorf(octaves);
-  if (rmd != 0.0f) {
-    value += rmd * ((snoise_2d(p) + offset) * pwr);
+  if ((rmd != 0.0f) && (weight > 0.001f)) {
+    if (weight > 1.0f) {
+      weight = 1.0f;
+    }
+    float signal = (snoise_2d(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -461,13 +467,13 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_3d(
 {
   float3 p = co;
   float pwHL = powf(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = snoise_3d(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0f;
+  float value = 0.0f;
+  float weight = 1.0f;
+
 
-  for (int i = 1; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
+  for (int i = 0; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
     }
@@ -480,8 +486,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_3d(
   }
 
   float rmd = octaves - floorf(octaves);
-  if (rmd != 0.0f) {
-    value += rmd * ((snoise_3d(p) + offset) * pwr);
+  if ((rmd != 0.0f) && (weight > 0.001f)){
+    if (weight > 1.0f) {
+      weight = 1.0f;
+    }
+    float signal = (snoise_3d(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -632,13 +642,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_4d(
 {
   float4 p = co;
   float pwHL = powf(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = snoise_4d(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0f;
+  float value = 0.0f;
+  float weight = 1.0f;
 
-  for (int i = 1; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
+  for (int i = 0; (weight > 0.001f) && (i < float_to_int(octaves)); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
     }
@@ -651,8 +660,12 @@ ccl_device_noinline_cpu float noise_musgrave_hybrid_multi_fractal_4d(
   }
 
   float rmd = octaves - floorf(octaves);
-  if (rmd != 0.0f) {
-    value += rmd * ((snoise_4d(p) + offset) * pwr);
+  if ((rmd != 0.0f) && (weight > 0.001f)) {
+    if (weight > 1.0f) {
+      weight = 1.0f;
+    }
+    float signal = (snoise_4d(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
diff --git a/source/blender/blenlib/intern/noise.cc b/source/blender/blenlib/intern/noise.cc
index a514c9e5183..3de9b17d3c4 100644
--- a/source/blender/blenlib/intern/noise.cc
+++ b/source/blender/blenlib/intern/noise.cc
@@ -809,15 +809,14 @@ float musgrave_hybrid_multi_fractal(const float co,
 {
   float p = co;
   const float pwHL = std::pow(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = perlin_signed(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0f;
+  float value = 0.0f;
+  float weight = 1.0f;
 
   const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
-  for (int i = 1; (weight > 0.001f) && (i < (int)octaves); i++) {
+  for (int i = 0; (weight > 0.001f) && (i < (int)octaves); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
     }
@@ -830,8 +829,12 @@ float musgrave_hybrid_multi_fractal(const float co,
   }
 
   const float rmd = octaves - floorf(octaves);
-  if (rmd != 0.0f) {
-    value += rmd * ((perlin_signed(p) + offset) * pwr);
+  if ((rmd != 0.0f) && (weight > 0.001f)) {
+    if (weight > 1.0f) {
+      weight = 1.0f;
+    }
+    float signal = (perlin_signed(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -961,15 +964,14 @@ float musgrave_hybrid_multi_fractal(const float2 co,
 {
   float2 p = co;
   const float pwHL = std::pow(lacunarity, -H);
-  float pwr = pwHL;
 
-  float value = perlin_signed(p) + offset;
-  float weight = gain * value;
-  p *= lacunarity;
+  float pwr = 1.0f;
+  float value = 0.0f;
+  float weight = 1.0f;
 
   const float octaves = CLAMPIS(octaves_unclamped, 0.0f, 15.0f);
 
-  for (int i = 1; (weight > 0.001f) && (i < (int)octaves); i++) {
+  for (int i = 0; (weight > 0.001f) && (i < (int)octaves); i++) {
     if (weight > 1.0f) {
       weight = 1.0f;
     }
@@ -982,8 +984,12 @@ float musgrave_hybrid_multi_fractal(const float2 co,
   }
 
   const float rmd = octaves - floorf(octaves);
-  if (rmd != 0.0f) {
-    value += rmd * ((perlin_signed(p) + offset) * pwr);
+  if ((rmd != 0.0f) && (weight > 0.001f)) {
+    if (weight > 1.0f) {
+      weight = 1.0f;
+    }
+    float signal = (perlin_signed(p) + offset) * pwr;
+    value += rmd * weight * signal;
   }
 
   return value;
@@ -1115,15 +1121,

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list