diff options
3 files changed, 21 insertions, 24 deletions
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, |