summaryrefslogtreecommitdiffstats
path: root/noise.cginc
diff options
context:
space:
mode:
authoryum <yum.food.vr@gmail.com>2024-10-07 23:33:35 -0700
committeryum <yum.food.vr@gmail.com>2024-10-07 23:33:35 -0700
commitbcadf1d091efe76e7a1b2393f87f7e24128b723b (patch)
treeb5a37c88686f15f08845d597f223473511917a34 /noise.cginc
parente51760ab5e6d698b26b60e1811e7afce62be55d0 (diff)
Add fog gimmick
Diffstat (limited to 'noise.cginc')
-rw-r--r--noise.cginc92
1 files changed, 92 insertions, 0 deletions
diff --git a/noise.cginc b/noise.cginc
new file mode 100644
index 0000000..a58e56d
--- /dev/null
+++ b/noise.cginc
@@ -0,0 +1,92 @@
+#include "math.cginc"
+
+#ifndef __NOISE_INC
+#define __NOISE_INC
+
+float cubic_interp(float x)
+{
+ return x * x * (3.0 - 2.0 * x);
+}
+
+float2 cubic_interp(float2 x)
+{
+ return x * x * (3.0 - 2.0 * x);
+}
+
+float3 cubic_interp(float3 x)
+{
+ return x * x * (3.0 - 2.0 * x);
+}
+
+float quintic_interp(float x)
+{
+ return x * x * x * (x * (x * 6 - 15) + 10);
+}
+
+float2 quintic_interp(float2 x)
+{
+ return x * x * x * (x * (x * 6 - 15) + 10);
+}
+
+float perlin_noise(float2 p)
+{
+ float2 sq = floor(p);
+ float2 sqi = frac(p);
+
+ float r0 = rand2(sq + float2(0,0));
+ float r1 = rand2(sq + float2(1,0));
+ float r2 = rand2(sq + float2(0,1));
+ float r3 = rand2(sq + float2(1,1));
+
+ float2 u = cubic_interp(sqi);
+
+ return lerp(r0, r1, u.x) +
+ (r2 - r0) * u.y * (1.0 - u.x) +
+ (r3 - r1) * u.x * u.y;
+}
+
+float perlin_noise_3d(float3 p)
+{
+ float3 sq = floor(p);
+ float3 sqi = frac(p);
+
+ float r0 = rand3(sq + float3(0,0,0));
+ float r1 = rand3(sq + float3(1,0,0));
+ float r2 = rand3(sq + float3(0,1,0));
+ float r3 = rand3(sq + float3(1,1,0));
+ float r4 = rand3(sq + float3(0,0,1));
+ float r5 = rand3(sq + float3(1,0,1));
+ float r6 = rand3(sq + float3(0,1,1));
+ float r7 = rand3(sq + float3(1,1,1));
+
+ float3 u = cubic_interp(sqi);
+
+ return lerp(
+ lerp(r0, r1, u.x) +
+ (r2 - r0) * u.y * (1.0 - u.x) +
+ (r3 - r1) * u.x * u.y,
+ lerp(r4, r5, u.x) +
+ (r6 - r4) * u.y * (1.0 - u.x) +
+ (r7 - r5) * u.x * u.y,
+ u.z);
+}
+
+float simplex_noise(float2 p)
+{
+ float2 sq = floor(p);
+ float2 sqi = frac(p);
+
+ float r0 = rand2(sq + float2(0,0));
+ float r1 = rand2(sq + float2(1,0));
+ float r2 = rand2(sq + float2(0,1));
+ float r3 = rand2(sq + float2(1,1));
+
+ float2 u = quintic_interp(sqi);
+
+ return lerp(r0, r1, u.x) +
+ (r2 - r0) * u.y * (1.0 - u.x) +
+ (r3 - r1) * u.x * u.y;
+}
+
+#endif // __NOISE_INC
+