yum-archive/SoggyShaders
Old Unity shaders.
git clone https://git.yummers.dev/yum-archive/SoggyShaders
03368f2
master
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