Nodes: fix Voronoi Noise discontinuities when Lacunarity is 0.0.
When the Lacunarity input is driven by e.g. a Texture discontinuities can arise because the `for` loop breaks prematurely. Pull Request: https://projects.blender.org/blender/blender/pulls/111395
This commit is contained in:
parent
ba44afae5e
commit
af54b16778
@ -9,6 +9,8 @@
|
||||
|
||||
#define vector3 point
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
#define FRACTAL_VORONOI_X_FX(T) \
|
||||
VoronoiOutput fractal_voronoi_x_fx(VoronoiParams params, T coord) \
|
||||
{ \
|
||||
@ -20,7 +22,7 @@
|
||||
Output.Distance = 0.0; \
|
||||
Output.Color = color(0.0, 0.0, 0.0); \
|
||||
Output.Position = vector4(0.0, 0.0, 0.0, 0.0); \
|
||||
int zero_input = params.detail == 0.0 || params.roughness == 0.0 || params.lacunarity == 0.0; \
|
||||
int zero_input = params.detail == 0.0 || params.roughness == 0.0; \
|
||||
\
|
||||
for (int i = 0; i <= ceil(params.detail); ++i) { \
|
||||
VoronoiOutput octave; \
|
||||
@ -71,6 +73,8 @@
|
||||
return Output; \
|
||||
}
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
#define FRACTAL_VORONOI_DISTANCE_TO_EDGE_FUNCTION(T) \
|
||||
float fractal_voronoi_distance_to_edge(VoronoiParams params, T coord) \
|
||||
{ \
|
||||
@ -79,7 +83,7 @@
|
||||
float scale = 1.0; \
|
||||
float distance = 8.0; \
|
||||
\
|
||||
int zero_input = params.detail == 0.0 || params.roughness == 0.0 || params.lacunarity == 0.0; \
|
||||
int zero_input = params.detail == 0.0 || params.roughness == 0.0; \
|
||||
\
|
||||
for (int i = 0; i <= ceil(params.detail); ++i) { \
|
||||
float octave_distance = voronoi_distance_to_edge(params, coord * scale); \
|
||||
|
@ -880,6 +880,8 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams ¶ms
|
||||
|
||||
/* **** Fractal Voronoi **** */
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
template<typename T>
|
||||
ccl_device VoronoiOutput fractal_voronoi_x_fx(ccl_private const VoronoiParams ¶ms,
|
||||
const T coord)
|
||||
@ -889,8 +891,7 @@ ccl_device VoronoiOutput fractal_voronoi_x_fx(ccl_private const VoronoiParams &p
|
||||
float scale = 1.0f;
|
||||
|
||||
VoronoiOutput output;
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f ||
|
||||
params.lacunarity == 0.0f;
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f;
|
||||
|
||||
for (int i = 0; i <= ceilf(params.detail); ++i) {
|
||||
VoronoiOutput octave = (params.feature == NODE_VORONOI_F2) ?
|
||||
@ -936,6 +937,8 @@ ccl_device VoronoiOutput fractal_voronoi_x_fx(ccl_private const VoronoiParams &p
|
||||
return output;
|
||||
}
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
template<typename T>
|
||||
ccl_device float fractal_voronoi_distance_to_edge(ccl_private const VoronoiParams ¶ms,
|
||||
const T coord)
|
||||
@ -945,8 +948,7 @@ ccl_device float fractal_voronoi_distance_to_edge(ccl_private const VoronoiParam
|
||||
float scale = 1.0f;
|
||||
float distance = 8.0f;
|
||||
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f ||
|
||||
params.lacunarity == 0.0f;
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f;
|
||||
|
||||
for (int i = 0; i <= ceilf(params.detail); ++i) {
|
||||
const float octave_distance = voronoi_distance_to_edge(params, coord * scale);
|
||||
|
@ -2309,6 +2309,8 @@ float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float4 coord)
|
||||
|
||||
/* **** Fractal Voronoi **** */
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
template<typename T>
|
||||
VoronoiOutput fractal_voronoi_x_fx(const VoronoiParams ¶ms,
|
||||
const T coord,
|
||||
@ -2319,8 +2321,7 @@ VoronoiOutput fractal_voronoi_x_fx(const VoronoiParams ¶ms,
|
||||
float scale = 1.0f;
|
||||
|
||||
VoronoiOutput output;
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f ||
|
||||
params.lacunarity == 0.0f;
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f;
|
||||
|
||||
for (int i = 0; i <= ceilf(params.detail); ++i) {
|
||||
VoronoiOutput octave = (params.feature == NOISE_SHD_VORONOI_F2) ?
|
||||
@ -2367,6 +2368,8 @@ VoronoiOutput fractal_voronoi_x_fx(const VoronoiParams ¶ms,
|
||||
return output;
|
||||
}
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
template<typename T>
|
||||
float fractal_voronoi_distance_to_edge(const VoronoiParams ¶ms, const T coord)
|
||||
{
|
||||
@ -2375,8 +2378,7 @@ float fractal_voronoi_distance_to_edge(const VoronoiParams ¶ms, const T coor
|
||||
float scale = 1.0f;
|
||||
float distance = 8.0f;
|
||||
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f ||
|
||||
params.lacunarity == 0.0f;
|
||||
const bool zero_input = params.detail == 0.0f || params.roughness == 0.0f;
|
||||
|
||||
for (int i = 0; i <= ceilf(params.detail); ++i) {
|
||||
const float octave_distance = voronoi_distance_to_edge(params, coord * scale);
|
||||
|
@ -6,6 +6,8 @@
|
||||
#pragma BLENDER_REQUIRE(gpu_shader_common_math_utils.glsl)
|
||||
#pragma BLENDER_REQUIRE(gpu_shader_material_voronoi.glsl)
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
#define FRACTAL_VORONOI_X_FX(T) \
|
||||
VoronoiOutput fractal_voronoi_x_fx(VoronoiParams params, T coord) \
|
||||
{ \
|
||||
@ -17,8 +19,7 @@
|
||||
Output.Distance = 0.0; \
|
||||
Output.Color = vec3(0.0, 0.0, 0.0); \
|
||||
Output.Position = vec4(0.0, 0.0, 0.0, 0.0); \
|
||||
bool zero_input = params.detail == 0.0 || params.roughness == 0.0 || \
|
||||
params.lacunarity == 0.0; \
|
||||
bool zero_input = params.detail == 0.0 || params.roughness == 0.0; \
|
||||
\
|
||||
for (int i = 0; i <= ceil(params.detail); ++i) { \
|
||||
VoronoiOutput octave; \
|
||||
@ -69,6 +70,8 @@
|
||||
return Output; \
|
||||
}
|
||||
|
||||
/* The fractalization logic is the same as for fBM Noise, except that some additions are replaced
|
||||
* by lerps. */
|
||||
#define FRACTAL_VORONOI_DISTANCE_TO_EDGE_FUNCTION(T) \
|
||||
float fractal_voronoi_distance_to_edge(VoronoiParams params, T coord) \
|
||||
{ \
|
||||
@ -77,8 +80,7 @@
|
||||
float scale = 1.0; \
|
||||
float distance = 8.0; \
|
||||
\
|
||||
bool zero_input = params.detail == 0.0 || params.roughness == 0.0 || \
|
||||
params.lacunarity == 0.0; \
|
||||
bool zero_input = params.detail == 0.0 || params.roughness == 0.0; \
|
||||
\
|
||||
for (int i = 0; i <= ceil(params.detail); ++i) { \
|
||||
float octave_distance = voronoi_distance_to_edge(params, coord * scale); \
|
||||
|
Loading…
Reference in New Issue
Block a user