Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1#define_import_path bevy_gaussian_splatting::noise
3// MIT License. © Ian McEwan, Stefan Gustavson, Munrocket, Johan Helsing
4//
5fn mod289_2d(x: vec2<f32>) -> vec2<f32> {
6 return x - floor(x * (1.0 / 289.0)) * 289.0;
7}
9fn mod289_3d(x: vec3<f32>) -> vec3<f32> {
10 return x - floor(x * (1.0 / 289.0)) * 289.0;
13fn permute_3d(x: vec3<f32>) -> vec3<f32> {
14 return mod289_3d(((x * 34.0) + 1.0) * x);
17// MIT License. © Ian McEwan, Stefan Gustavson, Munrocket
18fn simplex_2d(v: vec2<f32>) -> f32 {
19 let C = vec4(
20 0.211324865405187, // (3.0-sqrt(3.0))/6.0
21 0.366025403784439, // 0.5*(sqrt(3.0)-1.0)
22 -0.577350269189626, // -1.0 + 2.0 * C.x
23 0.024390243902439 // 1.0 / 41.0
24 );
26 // First corner
27 var i = floor(v + dot(v, C.yy));
28 let x0 = v - i + dot(i, C.xx);
30 // Other corners
31 var i1 = select(vec2(0., 1.), vec2(1., 0.), x0.x > x0.y);
33 // x0 = x0 - 0.0 + 0.0 * C.xx ;
34 // x1 = x0 - i1 + 1.0 * C.xx ;
35 // x2 = x0 - 1.0 + 2.0 * C.xx ;
36 var x12 = x0.xyxy + C.xxzz;
37 x12.x = x12.x - i1.x;
38 x12.y = x12.y - i1.y;
40 // Permutations
41 i = mod289_2d(i); // Avoid truncation effects in permutation
43 var p = permute_3d(permute_3d(i.y + vec3(0., i1.y, 1.)) + i.x + vec3(0., i1.x, 1.));
44 var m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), vec3(0.));
45 m *= m;
46 m *= m;
48 // Gradients: 41 points uniformly over a line, mapped onto a diamond.
49 // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287)
50 let x = 2. * fract(p * C.www) - 1.;
51 let h = abs(x) - 0.5;
52 let ox = floor(x + 0.5);
53 let a0 = x - ox;
55 // Normalize gradients implicitly by scaling m
56 // Approximation of: m *= inversesqrt( a0*a0 + h*h );
57 m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);
59 // Compute final noise value at P
60 let g = vec3(a0.x * x0.x + h.x * x0.y, a0.yz * x12.xz + h.yz * x12.yw);
61 return 130. * dot(m, g);
64// MIT License. © Stefan Gustavson, Munrocket
65fn permute4_(x: vec4<f32>) -> vec4<f32> { return ((x * 34.0 + 1.0) * x) % vec4<f32>(289.0); }
66fn taylorInvSqrt4_(r: vec4<f32>) -> vec4<f32> { return 1.79284291400159 - 0.85373472095314 * r; }
67fn fade3_(t: vec3<f32>) -> vec3<f32> { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }
69fn perlin_3d(P: vec3<f32>) -> f32 {
70 var Pi0 : vec3<f32> = floor(P); // Integer part for indexing
71 var Pi1 : vec3<f32> = Pi0 + vec3<f32>(1.0); // Integer part + 1
72 Pi0 = Pi0 % vec3<f32>(289.0);
73 Pi1 = Pi1 % vec3<f32>(289.0);
74 let Pf0 = fract(P); // Fractional part for interpolation
75 let Pf1 = Pf0 - vec3<f32>(1.0); // Fractional part - 1.
76 let ix = vec4<f32>(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
77 let iy = vec4<f32>(Pi0.yy, Pi1.yy);
78 let iz0 = Pi0.zzzz;
79 let iz1 = Pi1.zzzz;
81 let ixy = permute4_(permute4_(ix) + iy);
82 let ixy0 = permute4_(ixy + iz0);
83 let ixy1 = permute4_(ixy + iz1);
85 var gx0: vec4<f32> = ixy0 / 7.0;
86 var gy0: vec4<f32> = fract(floor(gx0) / 7.0) - 0.5;
87 gx0 = fract(gx0);
88 var gz0: vec4<f32> = vec4<f32>(0.5) - abs(gx0) - abs(gy0);
89 var sz0: vec4<f32> = step(gz0, vec4<f32>(0.0));
90 gx0 = gx0 + sz0 * (step(vec4<f32>(0.0), gx0) - 0.5);
91 gy0 = gy0 + sz0 * (step(vec4<f32>(0.0), gy0) - 0.5);
93 var gx1: vec4<f32> = ixy1 / 7.0;
94 var gy1: vec4<f32> = fract(floor(gx1) / 7.0) - 0.5;
95 gx1 = fract(gx1);
96 var gz1: vec4<f32> = vec4<f32>(0.5) - abs(gx1) - abs(gy1);
97 var sz1: vec4<f32> = step(gz1, vec4<f32>(0.0));
98 gx1 = gx1 - sz1 * (step(vec4<f32>(0.0), gx1) - 0.5);
99 gy1 = gy1 - sz1 * (step(vec4<f32>(0.0), gy1) - 0.5);
101 var g000: vec3<f32> = vec3<f32>(gx0.x, gy0.x, gz0.x);
102 var g100: vec3<f32> = vec3<f32>(gx0.y, gy0.y, gz0.y);
103 var g010: vec3<f32> = vec3<f32>(gx0.z, gy0.z, gz0.z);
104 var g110: vec3<f32> = vec3<f32>(gx0.w, gy0.w, gz0.w);
105 var g001: vec3<f32> = vec3<f32>(gx1.x, gy1.x, gz1.x);
106 var g101: vec3<f32> = vec3<f32>(gx1.y, gy1.y, gz1.y);
107 var g011: vec3<f32> = vec3<f32>(gx1.z, gy1.z, gz1.z);
108 var g111: vec3<f32> = vec3<f32>(gx1.w, gy1.w, gz1.w);
110 let norm0 = taylorInvSqrt4_(
111 vec4<f32>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
112 g000 = g000 * norm0.x;
113 g010 = g010 * norm0.y;
114 g100 = g100 * norm0.z;
115 g110 = g110 * norm0.w;
116 let norm1 = taylorInvSqrt4_(
117 vec4<f32>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
118 g001 = g001 * norm1.x;
119 g011 = g011 * norm1.y;
120 g101 = g101 * norm1.z;
121 g111 = g111 * norm1.w;
123 let n000 = dot(g000, Pf0);
124 let n100 = dot(g100, vec3<f32>(Pf1.x, Pf0.yz));
125 let n010 = dot(g010, vec3<f32>(Pf0.x, Pf1.y, Pf0.z));
126 let n110 = dot(g110, vec3<f32>(Pf1.xy, Pf0.z));
127 let n001 = dot(g001, vec3<f32>(Pf0.xy, Pf1.z));
128 let n101 = dot(g101, vec3<f32>(Pf1.x, Pf0.y, Pf1.z));
129 let n011 = dot(g011, vec3<f32>(Pf0.x, Pf1.yz));
130 let n111 = dot(g111, Pf1);
132 var fade_xyz: vec3<f32> = fade3_(Pf0);
133 let temp = vec4<f32>(f32(fade_xyz.z)); // simplify after chrome bug fix
134 let n_z = mix(vec4<f32>(n000, n100, n010, n110), vec4<f32>(n001, n101, n011, n111), temp);
135 let n_yz = mix(n_z.xy, n_z.zw, vec2<f32>(f32(fade_xyz.y))); // simplify after chrome bug fix
136 let n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
137 return 2.2 * n_xyz;
140// <https://www.shadertoy.com/view/Xd23Dh>
141// by Inigo Quilez
142fn hash_23_(p: vec2<f32>) -> vec3<f32> {
143 let q = vec3<f32>(dot(p, vec2<f32>(127.1, 311.7)),
144 dot(p, vec2<f32>(269.5, 183.3)),
145 dot(p, vec2<f32>(419.2, 371.9)));
146 return fract(sin(q) * 43758.5453);
149fn voro_2d(x: vec2<f32>, u: f32, v: f32) -> f32 {
150 let p = floor(x);
151 let f = fract(x);
152 let k = 1.0 + 63.0 * pow(1. - v, 4.0);
153 var va: f32 = 0.0;
154 var wt: f32 = 0.0;
155 for(var j: i32 = -2; j <= 2; j = j + 1) {
156 for(var i: i32 = -2; i <= 2; i = i + 1) {
157 let g = vec2<f32>(f32(i), f32(j));
158 let o = hash_23_(p + g) * vec3<f32>(u, u, 1.0);
159 let r = g - f + o.xy;
160 let d = dot(r, r);
161 let ww = pow(1. - smoothstep(0.0, 1.414, sqrt(d)), k);
162 va = va + o.z * ww;
163 wt = wt + ww;
164 }
165 }
166 return va / wt;
169fn nrand(n: vec2<f32>) -> f32 {
170 return fract(sin(dot(n, vec2<f32>(12.9898, 4.1414))) * 43758.5453);
173fn noise_2d(n: vec2<f32>) -> f32 {
174 let d = vec2<f32>(0.0, 1.0);
175 let b = floor(n);
176 let f = smoothstep(vec2<f32>(0.0), vec2<f32>(1.0), fract(n));
177 return mix(mix(nrand(b), nrand(b + d.yx), f.x), mix(nrand(b + d.xy), nrand(b + d.yy), f.x), f.y);
180// https://www.shadertoy.com/view/MlVSzw
181const ALPHA: f32 = 0.14;
182const INV_ALPHA: f32 = 7.14285714286;
183const K: f32 = 0.08912676813;
185fn inv_error_function(x: f32) -> f32 {
186 let y: f32 = log(1.0 - x*x);
187 let z: f32 = K + 0.5 * y;
188 return sqrt(sqrt(z*z - y * INV_ALPHA) - z) * sign(x);
191// expects n to be in ~[0, 1]
192fn gaussian_rand(n: vec2<f32>) -> f32 {
193 let x: f32 = nrand(n * 13.7);
195 return inv_error_function(x * 2.0 - 1.0) * 0.3;
Contents