yum-archive/SoggyShaders

Old Unity shaders.

git clone https://git.yummers.dev/yum-archive/SoggyShaders

yumAdd displacement shader81b4642

master
1.9 KiB87 linesraw
1#ifndef __MATH_INC
2#define __MATH_INC
3
4#include "pema99.cginc"
5
6// Differentiable approximation of the standard `max` function.
7float dmax(float a, float b, float k)
8{
9  return log2(exp2(k * a) + exp2(k * b)) / k;
10}
11
12// Differentiable approximation of the standard `min` function.
13float dmin(float a, float b, float k)
14{
15  return -1.0 * dmax(-1.0 * a, -1.0 * b, k);
16}
17
18float dabs(float a, float k)
19{
20  return log2(exp2(k * a) + exp2(-1.0 * k * a));
21}
22
23// Generate a random number on [0, 1].
24float rand2(float3 p)
25{
26  return frac(sin(dot(p, float2(561.0, 885.0))) * 776.2) / 2.0;
27}
28
29// Generate a random number on [0, 1].
30float rand3(float3 p)
31{
32  return frac(sin(dot(p, float3(897.0, 367.0, 197.0))) * 1073.6) / 2.0;
33}
34
35float length2(float2 p)
36{
37  return p.x * p.x + p.y * p.y;
38}
39
40// 3 dimensional value noise. `p` is assumed to be a point inside a unit cube.
41// Theory: https://en.wikipedia.org/wiki/Value_noise
42float vnoise3d(float3 p)
43{
44  float3 pu = floor(p);
45  float3 pv = glsl_mod(frac(p), 1.0);
46
47  // Assign random numbers to the corner of a cube.
48  float n000 = rand3(pu + float3(0,0,0));
49  float n001 = rand3(pu + float3(0,0,1));
50  float n010 = rand3(pu + float3(0,1,0));
51  float n011 = rand3(pu + float3(0,1,1));
52  float n100 = rand3(pu + float3(1,0,0));
53  float n101 = rand3(pu + float3(1,0,1));
54  float n110 = rand3(pu + float3(1,1,0));
55  float n111 = rand3(pu + float3(1,1,1));
56
57  float n00 = lerp(n000, n001, pv.z);
58  float n01 = lerp(n010, n011, pv.z);
59  float n10 = lerp(n100, n101, pv.z);
60  float n11 = lerp(n110, n111, pv.z);
61
62  float n0 = lerp(n00, n01, pv.y);
63  float n1 = lerp(n10, n11, pv.y);
64  
65  float n = lerp(n0, n1, pv.x);
66
67  return n;
68}
69
70float fbm(float3 p, const int n_octaves, float w)
71{
72  float g = exp2(-w);
73  float a = 1.0;
74  float p_scale = 1.0;
75
76  float res = 0.0;
77  for (int i = 0; i < n_octaves; i++) {
78    res += a * vnoise3d(p * p_scale);
79
80    p_scale /= w;
81    a *= g;
82  }
83  return res;
84}
85
86#endif  // __MATH_INC
87