分形布朗运动(Fractal Brownian Motion)也就是fbm,它不是噪声,但是他可以让噪声有更多的细节。可以看成把不同比例位置的一张噪声合并在一起。
// Properties
const int octaves = 1;
float lacunarity = 2.0;
float gain = 0.5;
// Initial values
float amplitude = 0.5;
float frequency = 1.;
// Loop of octaves
for (int i = 0; i < octaves; i++) {
value += amplitude * noise(frequency*uv);
frequency *= lacunarity;
amplitude *= gain;
这就是一种 fbm函数 前面讲了可以吧fbm看成多张噪声的叠加
amplitude表示每一次噪声叠加的权值,frequency 则是叠加噪声的比例
octaves是循环次数,可以看成叠加几张噪声
lacunarity和gain则是用于修改amplitude和frequency 的值,让每次叠加的噪声权值和大小都不同。
fbm噪声
值噪声+fbm
Shader "Custom/FBMValueNoise" {
Properties{
_Scale("Scale",Range(4,20)) = 10
[Header(properties)]
_Octaves("Octaves",Int) = 1
_Lacunarity("lacunarity",Float)=2
_Gain("gain",Float)=0.5
[Header(fbm init)]
_Amplitude("amolitude",Float) = 0.5
_Frequency("frequency",Float) = 1.0
SubShader{
Pass{
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert
#pragma fragment frag
float _Scale;
int _Octaves;
float _Lacunarity;
float _Gain;
float _Amplitude;
float _Frequency;
struct v2f {
float4 pos:SV_POSITION;
half2 uv:TEXCOORD0;
v2f vert(appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
float rand(float2 st) {
return frac(sin(dot(st.xy,
float2(12.9898, 78.233)))
* 43758.5453123);
float mix(float a, float b, float t) {
return b*t + a*(1 - t);
float ValueNoise(float2 uv) {
float2 i = floor(uv);
float2 f = frac(uv);
float a = rand(i);
float b = rand(i + float2(1, 0));
float c = rand(i + float2(0, 1));
float d = rand(i + float2(1, 1));
float2 u = f*f*(3.0 - 2.0*f);
return mix(a, b, u.x) +
(c - a)* u.y * (1.0 - u.x) +
(d - b) * u.x * u.y;
//return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
float fbm(float2 uv) {
/*如果要多次使用,要把_Frequency和_Amplitude赋值给新的,不能直接用,因为这两个是全局的*/
float v;
for (int i = 0; i < _Octaves; i++) {
v += _Amplitude*ValueNoise(_Frequency*uv);
_Frequency *= _Lacunarity;
_Amplitude *= _Gain;
return v;
fixed4 frag(v2f i) :SV_Target{
half2 uv = i.uv * _Scale;
float noise = fbm(uv);
return fixed4(noise, noise, noise, 1);
ENDCG
FallBack "Diffuse"
perlin噪声+fbm
simplex噪声+fbm
其他的FBM函数
上面其中一种FBM方法,你还可以用其他的FBM,会有不同的效果
for (int i = 0; i < OCTAVES; i++) {
value += amplitude * abs(snoise(st));
st *= 2.;
amplitude *= .5;
这里多了个绝对值的运算
n = abs(n); // create creases
n = offset - n; // invert so creases are at top
n = n * n; // sharpen creases
PS:湍流和山脊这两张图和我参考的文章生成的图差别很大,可能是生成噪声的方式不同,建议参考原文
域翘曲(Domain Warping)
我们还可以用噪声来扭曲纹理坐标,可以看Inigo Quiles的这篇文章
Shader "Custom/Domain Warping" {
Properties{
_Scale("Scale",Float) = 10
[Header(properties)]
_Octaves("Octaves",Int) = 1
_Lacunarity("lacunarity",Float) = 2
_Gain("gain",Float) = 0.5
[Header(fbm init)]
_Amplitude("amolitude",Float) = 0.5
_Frequency("frequency",Float) = 1.0
[Header(Color)]
_Color0("Color0",Color)= (0.101961, 0.619608, 0.666667)
_Color1("Color1",Color) = (0.666667, 0.666667, 0.498039)
_Color2("Color2",Color) = (0, 0, 0.164706)
_Color3("Color3",Color) = (0.666667, 1, 1)
SubShader{
Pass{
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert
#pragma fragment frag
float _Scale;
int _Octaves;
float _Lacunarity;
float _Gain;
float _Amplitude;
float _Frequency;
float3 _Color0;
float3 _Color1;
float3 _Color2;
float3 _Color3;
struct v2f {
float4 pos:SV_POSITION;
half2 uv:TEXCOORD0;
inline float mix(float a, float b, float t) {
return b*t + a*(1 - t);
inline float3 mix3(float3 a, float3 b, float t) {
return float3(mix(a.x, b.x, t), mix(a.y, b.y, t), mix(a.z, b.z, t));
//from:https://www.shadertoy.com/view/XdXGW8
float2 random(float2 x) {
float2 k = float2(0.3183099, 0.3678794);
x = x*k + k.yx;
return -1.0 + 2.0*frac(16.0 * k*frac(x.x*x.y*(x.x + x.y)));
float perlinNoise(float2 uv) {
float2 i = floor(uv);
float2 f = frac(uv);
//为了直观 单独计算四个值
float value0 = dot(random(i + float2(0, 0)), f - float2(0, 0));
float value1 = dot(random(i + float2(1, 0)), f - float2(1, 0));
float value2 = dot(random(i + float2(0, 1)), f - float2(0, 1));
float value3 = dot(random(i + float2(1, 1)), f - float2(1, 1));
float2 u = f*f*(3.0 - 2.0*f);
return mix(mix(value0, value1,u.x), mix(value2, value3, u.x), u.y);
float fbm(in float2 uv) {
float v;
float frequency = _Frequency;
float amplitude = _Amplitude;
for (int i = 0; i < _Octaves; i++) {
v += amplitude*perlinNoise(frequency*uv);
frequency *= _Lacunarity;
amplitude *= _Gain;
return v;
float3 dw(float2 uv) {
//添加的向量只是单纯的偏移可以随便改
//第一层扭曲
float2 q = float2(fbm(uv + float2(0.0, 0.0)),
fbm(uv + float2(5.2, 1.3)));
//第二层扭曲
float2 r = float2(fbm(uv + 4.0*q + float2(1.7, 9.2) + 0.23*_Time.y),
fbm(uv + 4.0*q + float2(8.3, 2.8) + 0.53*_Time.y));
//第三层扭曲
float f= fbm(uv+4*r);
//第三层
float3 color = mix3(_Color0,_Color1,
clamp((f*f)*4.0, 0.0, 1.0));
//第一层
color = mix3(color, _Color2,
clamp(length(q), 0.0, 1.0));
//第二层
color = mix3(color, _Color3,
clamp(length(r.x), 0.0, 1.0));
return color;
v2f vert(appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
fixed4 frag(v2f i) :SV_Target{
float3 color = dw(i.uv*_Scale);
return fixed4(color, 1);
ENDCG
FallBack "Diffuse"
参考内容:https://thebookofshaders.com/13/?lan=ch
分形布朗运动FBM(Fractal Brown Motion)是1968年Mandelbrot和Ness两人提出的一种数学模型,它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。
布朗运动是1827年英国植物学家R.Brown发现的,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。
opengl中使用fbm
//-------------------------------------------------------------
分形布朗运动FBM(Fractal Brown Motion),是1968年Mandelbrot和Ness两人提出的一种数学模型,它常用于描述自然界的山脉、云层、地形地貌以
在纯Python中模拟短分数布朗运动(FBM)轨迹
快速模拟许多FBM轨迹的简单工具。 该存储库使用基于Riemann-Liouville积分的FBM版本,而不是Mandelbrot基于Weyl积分的版本。 在数值上,通过FBM协方差矩阵的Cholesky分解过滤高斯白噪声来实现仿真。
扩散系数的种类
fbm_sim使用扩散系数的两个不同参数化之一。 有关每种类型的说明,请参见笔记本的definitions.ipynb 。
import fbm_sim
# Create the simulator object
fbm_obj = fbm_sim.FractionalBrownianMotion(
128, # simulate 128 steps of this FBM
0.6, # Hurst parame
分形布朗运动FBM(Fractal Brown Motion)是1968年Mandelbrot和Ness两人提出的一种数学模型,它是一种随机运动,粒子的运动方向随时改变,其运动轨迹是一条无规则的折线,不受什么约束和支配。它主要用于描述自然界的山脉、云层、地形地貌以及模拟星球表面等不规则形状阶。
分型布朗运动的原理:https://thebookofshaders.com/13/?lan...
一、分形布朗运动FBM
分形布朗运动(Fractal Brownian Motion)也就是fbm,它不是噪声,但是他可以让噪声有更多的细节。可以看成把不同比例位置的一张噪声合并在一起。
通过添加不同的噪声迭代(octaves),我们以规则的步长(lacunarity)连续增加频率并降低噪声的幅度(增益),我们可以获得更精细的噪声粒度并获得更精细的细节。这种技术称为“分形布朗运动”(FBM),或简称为“分形噪声”。
具体原理可参照thebookofshaders一书详细简介。
二、raymarc.
FBMNoise噪声算法
FBM是Fractal Brownian Motion的简写,中文翻译为分形布朗运动。
FBMNoise是将其他噪声算法用不同的参数输入叠加起来得到的噪声。其可以平滑噪声里的高频区域(即突变区域),使整个噪声变化更平滑。
下图展示了FBM的基本形式,简单来说就是将多个不同频率的噪声按照不同的振幅进行混合。
代码非常简单,这里以perlinNoise柏林噪声为例。
只要在perlinNoise的原始文件中加入这样一个函数即可
public static f
我的专栏目录:小IVan:专题概述及目录zhuanlan.zhihu.com本篇概述: 程序化纹理有着很多好处,第一可以方便修改,当我们的生成逻辑写好后,想要调整的话就是调调参数的事情。第二就是思路清晰,这张图是怎么来的,逻辑非常清晰,而不是传统的图像绘制,画到哪儿想到哪儿,思维是游走的,离散的。第三我们可以实时生成,可以让纹理和玩家产生互动等等。 现在主流的是用Su...
趋势交易是投资中非常常见的交易手法,通过观察,在一轮完整的趋势行情中,价格并不会一路上涨或下跌而是在一波行情后会有一小段反向调整接着进入第二轮趋势行情。我们的波浪策略就是寻找分析这段调整行情来确定下一轮的趋势,策略以股指期货为例。
交易条件以多头为例:
a) 价格创20期新高
b) a条件满足后的3个周期内创2期新低,记录下这个新低值
c) b条件满足后的3个周期内再次出现20期新高,此时开仓买入
d) 止损条件:以b条件中的新低作为止损价格
e) 止盈条件:当价格达到2倍风险数额即2*(开仓价-止损价)止盈
分形布朗运动曲线讲解
大家好,今天我为大家讲解分形噪音的基础:分形布朗运动曲线的绘制。噪音在图形学领域非常受欢迎,特别是在复杂场景的应用,能在低消耗的情况下模拟出许多传统的欧式几何难以刻画的场景。例如使用perlin噪声可以模拟山脉地形,天空云层等等。这是本人的第一篇博客,后续本人将引领大家一起走进计算机图形领域!
布朗运动是1827年英国植物学家R.Brown发现的,它是一种随机运动,...