115 lines
2.9 KiB
Text
115 lines
2.9 KiB
Text
#include "snoise.msl"
|
|
#include "gnoise.msl"
|
|
|
|
|
|
/*
|
|
contributors: Patricio Gonzalez Vivo
|
|
description: Fractal Brownian Motion
|
|
use: fbm(<float2> pos)
|
|
options:
|
|
FBM_OCTAVES: numbers of octaves. Default is 4.
|
|
FBM_NOISE_FNC(UV): noise function to use Default 'snoise(UV)' (simplex noise)
|
|
FBM_VALUE_INITIAL: initial value. Default is 0.
|
|
FBM_SCALE_SCALAR: scalar. Defualt is 2.
|
|
FBM_AMPLITUD_INITIAL: initial amplitud value. Default is 0.5
|
|
FBM_AMPLITUD_SCALAR: amplitud scalar. Default is 0.5
|
|
examples:
|
|
- /shaders/generative_fbm.frag
|
|
license:
|
|
- Copyright (c) 2021 Patricio Gonzalez Vivo under Prosperity License - https://prosperitylicense.com/versions/3.0.0
|
|
- Copyright (c) 2021 Patricio Gonzalez Vivo under Patron License - https://lygia.xyz/license
|
|
*/
|
|
|
|
#ifndef FBM_OCTAVES
|
|
#define FBM_OCTAVES 4
|
|
#endif
|
|
|
|
#ifndef FBM_NOISE_FNC
|
|
#define FBM_NOISE_FNC(UV) snoise(UV)
|
|
#endif
|
|
|
|
#ifndef FBM_NOISE2_FNC
|
|
#define FBM_NOISE2_FNC(UV) FBM_NOISE_FNC(UV)
|
|
#endif
|
|
|
|
#ifndef FBM_NOISE3_FNC
|
|
#define FBM_NOISE3_FNC(UV) FBM_NOISE_FNC(UV)
|
|
#endif
|
|
|
|
#ifndef FBM_NOISE_TILABLE_FNC
|
|
#define FBM_NOISE_TILABLE_FNC(UV, TILE) gnoise(UV, TILE)
|
|
#endif
|
|
|
|
#ifndef FBM_NOISE3_TILABLE_FNC
|
|
#define FBM_NOISE3_TILABLE_FNC(UV, TILE) FBM_NOISE_TILABLE_FNC(UV, TILE)
|
|
#endif
|
|
|
|
#ifndef FBM_NOISE_TYPE
|
|
#define FBM_NOISE_TYPE float
|
|
#endif
|
|
|
|
#ifndef FBM_VALUE_INITIAL
|
|
#define FBM_VALUE_INITIAL 0.0
|
|
#endif
|
|
|
|
#ifndef FBM_SCALE_SCALAR
|
|
#define FBM_SCALE_SCALAR 2.0
|
|
#endif
|
|
|
|
#ifndef FBM_AMPLITUD_INITIAL
|
|
#define FBM_AMPLITUD_INITIAL 0.5
|
|
#endif
|
|
|
|
#ifndef FBM_AMPLITUD_SCALAR
|
|
#define FBM_AMPLITUD_SCALAR 0.5
|
|
#endif
|
|
|
|
#ifndef FNC_FBM
|
|
#define FNC_FBM
|
|
FBM_NOISE_TYPE fbm(float2 st) {
|
|
// Initial values
|
|
FBM_NOISE_TYPE value = FBM_NOISE_TYPE(FBM_VALUE_INITIAL);
|
|
float amplitud = FBM_AMPLITUD_INITIAL;
|
|
|
|
// Loop of octaves
|
|
for (int i = 0; i < FBM_OCTAVES; i++) {
|
|
value += amplitud * FBM_NOISE2_FNC(st);
|
|
st *= FBM_SCALE_SCALAR;
|
|
amplitud *= FBM_AMPLITUD_SCALAR;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
FBM_NOISE_TYPE fbm(float3 pos) {
|
|
// Initial values
|
|
FBM_NOISE_TYPE value = FBM_NOISE_TYPE(FBM_VALUE_INITIAL);
|
|
float amplitud = FBM_AMPLITUD_INITIAL;
|
|
|
|
// Loop of octaves
|
|
for (int i = 0; i < FBM_OCTAVES; i++) {
|
|
value += amplitud * FBM_NOISE3_FNC(pos);
|
|
pos *= FBM_SCALE_SCALAR;
|
|
amplitud *= FBM_AMPLITUD_SCALAR;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
FBM_NOISE_TYPE fbm(float3 p, float tileLength) {
|
|
const float persistence = 0.5;
|
|
const float lacunarity = 2.0;
|
|
|
|
float amplitude = 0.5;
|
|
FBM_NOISE_TYPE total = FBM_NOISE_TYPE(0.0);
|
|
float normalization = 0.0;
|
|
|
|
for (int i = 0; i < FBM_OCTAVES; ++i) {
|
|
float noiseValue = FBM_NOISE3_TILABLE_FNC(p, tileLength * lacunarity * 0.5) * 0.5 + 0.5;
|
|
total += noiseValue * amplitude;
|
|
normalization += amplitude;
|
|
amplitude *= persistence;
|
|
p = p * lacunarity;
|
|
}
|
|
|
|
return total / normalization;
|
|
}
|
|
#endif
|