[Bf-blender-cvs] [340cbc7f153] master: Fix T79803: Wrong Distance To Edge 1D Voronoi

OmarSquircleArt noreply at git.blender.org
Thu Sep 3 18:54:49 CEST 2020


Commit: 340cbc7f153737fbd228bdf35b0cabb450decb1f
Author: OmarSquircleArt
Date:   Thu Sep 3 18:56:27 2020 +0200
Branches: master
https://developer.blender.org/rB340cbc7f153737fbd228bdf35b0cabb450decb1f

Fix T79803: Wrong Distance To Edge 1D Voronoi

The current 1D Voronoi implementation for the Distance to Edge option
computes the distance to the cells instead. This patch fixes that and
compute the distance to the edge.

Reviewed By: JacquesLucke, brecht

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

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

M	intern/cycles/kernel/shaders/node_voronoi_texture.osl
M	intern/cycles/kernel/svm/svm_voronoi.h
M	source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl

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

diff --git a/intern/cycles/kernel/shaders/node_voronoi_texture.osl b/intern/cycles/kernel/shaders/node_voronoi_texture.osl
index 04d61c32f8a..b95abc7f362 100644
--- a/intern/cycles/kernel/shaders/node_voronoi_texture.osl
+++ b/intern/cycles/kernel/shaders/node_voronoi_texture.osl
@@ -175,14 +175,13 @@ void voronoi_distance_to_edge_1d(float w, float randomness, output float outDist
   float cellPosition = floor(w);
   float localPosition = w - cellPosition;
 
-  float minDistance = 8.0;
-  for (int i = -1; i <= 1; i++) {
-    float cellOffset = float(i);
-    float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * randomness;
-    float distanceToPoint = distance(pointPosition, localPosition);
-    minDistance = min(distanceToPoint, minDistance);
-  }
-  outDistance = minDistance;
+  float midPointPosition = hash_float_to_float(cellPosition) * randomness;
+  float leftPointPosition = -1.0 + hash_float_to_float(cellPosition - 1.0) * randomness;
+  float rightPointPosition = 1.0 + hash_float_to_float(cellPosition + 1.0) * randomness;
+  float distanceToMidLeft = distance((midPointPosition + leftPointPosition) / 2.0, localPosition);
+  float distanceToMidRight = distance((midPointPosition + rightPointPosition) / 2.0, localPosition);
+
+  outDistance = min(distanceToMidLeft, distanceToMidRight);
 }
 
 void voronoi_n_sphere_radius_1d(float w, float randomness, output float outRadius)
diff --git a/intern/cycles/kernel/svm/svm_voronoi.h b/intern/cycles/kernel/svm/svm_voronoi.h
index f0fc0068fa2..10d17403f65 100644
--- a/intern/cycles/kernel/svm/svm_voronoi.h
+++ b/intern/cycles/kernel/svm/svm_voronoi.h
@@ -144,14 +144,13 @@ ccl_device void voronoi_distance_to_edge_1d(float w, float randomness, float *ou
   float cellPosition = floorf(w);
   float localPosition = w - cellPosition;
 
-  float minDistance = 8.0f;
-  for (int i = -1; i <= 1; i++) {
-    float cellOffset = i;
-    float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * randomness;
-    float distanceToPoint = fabsf(pointPosition - localPosition);
-    minDistance = min(distanceToPoint, minDistance);
-  }
-  *outDistance = minDistance;
+  float midPointPosition = hash_float_to_float(cellPosition) * randomness;
+  float leftPointPosition = -1.0f + hash_float_to_float(cellPosition - 1.0f) * randomness;
+  float rightPointPosition = 1.0f + hash_float_to_float(cellPosition + 1.0f) * randomness;
+  float distanceToMidLeft = fabsf((midPointPosition + leftPointPosition) / 2.0f - localPosition);
+  float distanceToMidRight = fabsf((midPointPosition + rightPointPosition) / 2.0f - localPosition);
+
+  *outDistance = min(distanceToMidLeft, distanceToMidRight);
 }
 
 ccl_device void voronoi_n_sphere_radius_1d(float w, float randomness, float *outRadius)
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl
index 0d8847176c9..470ce1a1fa7 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_tex_voronoi.glsl
@@ -158,14 +158,13 @@ void node_tex_voronoi_distance_to_edge_1d(vec3 coord,
   float cellPosition = floor(scaledCoord);
   float localPosition = scaledCoord - cellPosition;
 
-  float minDistance = 8.0;
-  for (int i = -1; i <= 1; i++) {
-    float cellOffset = float(i);
-    float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * randomness;
-    float distanceToPoint = voronoi_distance(pointPosition, localPosition, metric, exponent);
-    minDistance = min(distanceToPoint, minDistance);
-  }
-  outDistance = minDistance;
+  float midPointPosition = hash_float_to_float(cellPosition) * randomness;
+  float leftPointPosition = -1.0 + hash_float_to_float(cellPosition - 1.0) * randomness;
+  float rightPointPosition = 1.0 + hash_float_to_float(cellPosition + 1.0) * randomness;
+  float distanceToMidLeft = distance((midPointPosition + leftPointPosition) / 2.0, localPosition);
+  float distanceToMidRight = distance((midPointPosition + rightPointPosition) / 2.0, localPosition);
+
+  outDistance = min(distanceToMidLeft, distanceToMidRight);
 }
 
 void node_tex_voronoi_n_sphere_radius_1d(vec3 coord,



More information about the Bf-blender-cvs mailing list