Last active
October 11, 2024 16:20
-
-
Save shiyuugohirao/fd433dc890f9f3cc179880ce431cde76 to your computer and use it in GitHub Desktop.
glsl utils
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*-------------------------------------------------- | |
# glslUtils | |
- https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83 | |
- https://github.com/ashima/webgl-noise | |
- https://thebookofshaders.com/ | |
- https://github.com/jamieowen/glsl-blend | |
--------------------------------------------------*/ | |
/*============================== Color ==============================*/ | |
vec3 rgb2hsb( in vec3 c ){ | |
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); | |
vec4 p = mix(vec4(c.bg, K.wz),vec4(c.gb, K.xy),step(c.b, c.g)); | |
vec4 q = mix(vec4(p.xyw, c.r),vec4(c.r, p.yzx),step(p.x, c.r)); | |
float d = q.x - min(q.w, q.y); | |
float e = 1.0e-10; | |
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)),d / (q.x + e),q.x); | |
} | |
vec3 hsb2rgb( in vec3 c ){ | |
vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0), 6.0)-3.0)-1.0, 0.0, 1.0 ); | |
rgb = rgb*rgb*(3.0-2.0*rgb); | |
return c.z * mix(vec3(1.0), rgb, c.y); | |
} | |
/*============================== Blend ==============================*/ | |
//### Overlay | |
float blendOverlay(float base, float blend) { | |
return base<0.5?(2.0*base*blend):(1.0-2.0*(1.0-base)*(1.0-blend)); | |
} | |
vec3 blendOverlay(vec3 base, vec3 blend) { | |
return vec3(blendOverlay(base.r,blend.r),blendOverlay(base.g,blend.g),blendOverlay(base.b,blend.b)); | |
} | |
vec3 blendOverlay(vec3 base, vec3 blend, float opacity) { | |
return (blendOverlay(base, blend) * opacity + base * (1.0 - opacity)); | |
} | |
//### Screen | |
float blendScreen(float base, float blend) { | |
return 1.0-((1.0-base)*(1.0-blend)); | |
} | |
vec3 blendScreen(vec3 base, vec3 blend) { | |
return vec3(blendScreen(base.r,blend.r),blendScreen(base.g,blend.g),blendScreen(base.b,blend.b)); | |
} | |
vec3 blendScreen(vec3 base, vec3 blend, float opacity) { | |
return (blendScreen(base, blend) * opacity + base * (1.0 - opacity)); | |
} | |
/*============================== Math ==============================*/ | |
float Min(vec3 v){ return min(min(v.x,v.y), v.z);} | |
float Max(vec3 v){ return max(max(v.x,v.y), v.z);} | |
float random(float n){return fract(sin(n) * 43758.5453123);} | |
float random(vec2 st) {return fract(sin(dot(st.xy, vec2(12.9898, 78.233))) * 43758.5453123);} | |
float noise(float p){ | |
float fl = floor(p), fc = fract(p); | |
return mix(random(fl), random(fl + 1.0), fc); | |
} | |
float noise(vec2 n) { | |
const vec2 d = vec2(0.0, 1.0); | |
vec2 b = floor(n), f = smoothstep(vec2(0.0), vec2(1.0), fract(n)); | |
return mix(mix(random(b), random(b + d.yx), f.x), mix(random(b + d.xy), random(b + d.yy), f.x), f.y); | |
} | |
float mod289(float x) { return x - floor(x * (1.0 / 289.0)) * 289.0;} | |
vec2 mod289(vec2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0;} | |
vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0;} | |
vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0;} | |
float permute(float x) { return mod289(((x * 34.0) + 1.0) * x);} | |
vec2 permute(vec2 x) { return mod289(((x * 34.0) + 1.0) * x);} | |
vec3 permute(vec3 x) { return mod289(((x * 34.0) + 1.0) * x);} | |
vec4 permute(vec4 x) { return mod289(((x * 34.0) + 1.0) * x);} | |
/*============================== SimplexNoise ==============================*/ | |
//### 2D | |
float snoise(vec2 v) { | |
vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439); | |
vec2 i = floor(v + dot(v, C.yy)); | |
vec2 x0 = v - i + dot(i, C.xx); | |
vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); | |
vec4 x12 = x0.xyxy + C.xxzz; | |
x12.xy -= i1; | |
i = mod289(i); // Avoid truncation effects in permutation | |
vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0)); | |
vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0); | |
m = m * m; | |
m = m * m; | |
vec3 x = 2.0 * fract(p * C.www) - 1.0; | |
vec3 h = abs(x) - 0.5; | |
vec3 ox = floor(x + 0.5); | |
vec3 a0 = x - ox; | |
m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h); | |
vec3 g; | |
g.x = a0.x * x0.x + h.x * x0.y; | |
g.yz = a0.yz * x12.xz + h.yz * x12.yw; | |
return 130.0 * dot(m, g); | |
} | |
float fbm(vec2 uv, int oct) { | |
vec2 pos = uv; | |
float amp = 1.0, val = 0.0; | |
for (int i = 0; i < oct; i++) { | |
val += amp * snoise(pos); | |
pos *= 2.0; | |
amp *= 0.5; | |
} | |
return val; | |
} | |
//### 3D | |
float snoise(vec3 v) { | |
vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0); | |
vec4 D = vec4(0.0, 0.5, 1.0, 2.0); | |
vec3 i = floor(v + dot(v, C.yyy)); | |
vec3 x0 = v - i + dot(i, C.xxx); | |
vec3 g = step(x0.yzx, x0.xyz); | |
vec3 l = 1.0 - g; | |
vec3 i1 = min(g.xyz, l.zxy),i2 = max(g.xyz, l.zxy); | |
vec3 x1 = x0 - i1 + C.xxx, x2 = x0 - i2 + C.yyy, x3 = x0 - D.yyy; | |
i = mod289(i); | |
vec4 p = permute(permute(permute(i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + i.x + vec4(0.0, i1.x, i2.x, 1.0)); | |
float n_ = 0.142857142857; | |
vec3 ns = n_ * D.wyz - D.xzx; | |
vec4 j = p - 49.0 * floor(p * ns.z * ns.z); | |
vec4 x_ = floor(j * ns.z); | |
vec4 y_ = floor(j - 7.0 * x_); | |
vec4 x = x_ * ns.x + ns.yyyy; | |
vec4 y = y_ * ns.x + ns.yyyy; | |
vec4 h = 1.0 - abs(x) - abs(y); | |
vec4 b0 = vec4( x.xy, y.xy ); | |
vec4 b1 = vec4( x.zw, y.zw ); | |
vec4 s0 = floor(b0) * 2.0 + 1.0, s1 = floor(b1) * 2.0 + 1.0; | |
vec4 sh = -step(h, vec4(0, 0, 0, 0)); | |
vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy, a1 = b1.xzyw + s1.xzyw * sh.zzww; | |
vec3 p0 = vec3(a0.xy, h.x), p1 = vec3(a0.zw, h.y), p2 = vec3(a1.xy, h.z), p3 = vec3(a1.zw, h.w); | |
//Normalise gradients | |
vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)); | |
p0 *= norm.x; | |
p1 *= norm.y; | |
p2 *= norm.z; | |
p3 *= norm.w; | |
// Mix final noise value | |
vec4 m = max(0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0); | |
m = m * m; | |
return 42.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); | |
} | |
float fbm(vec2 uv, int oct, float time) { | |
vec2 pos = uv; | |
float amp = 1.0; | |
float val = 0.0; | |
for (int i = 0; i < oct; i++) { | |
val += amp * snoise(vec3(pos, time)); | |
pos *= 2.0; | |
amp *= 0.5; | |
} | |
return val; | |
} | |
/*============================== hash ==============================*/ | |
float hash11(float p) { | |
p = fract(p * .1031); | |
p *= p + 33.33; | |
p *= p + p; | |
return fract(p); | |
} | |
float hash12(vec2 p) { | |
vec3 p3 = fract(vec3(p.xyx) * .1031); | |
p3 += dot(p3, p3.yzx + 33.33); | |
return fract((p3.x + p3.y) * p3.z); | |
} | |
float hash13(vec3 p3) { | |
p3 = fract(p3 * .1031); | |
p3 += dot(p3, p3.zyx + 31.32); | |
return fract((p3.x + p3.y) * p3.z); | |
} | |
vec2 hash21(float p) { | |
vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973)); | |
p3 += dot(p3, p3.yzx + 33.33); | |
return fract((p3.xx + p3.yz) * p3.zy); | |
} | |
vec2 hash22(vec2 p) { | |
vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); | |
p3 += dot(p3, p3.yzx + 33.33); | |
return fract((p3.xx + p3.yz) * p3.zy); | |
} | |
vec2 hash23(vec3 p3) { | |
p3 = fract(p3 * vec3(.1031, .1030, .0973)); | |
p3 += dot(p3, p3.yzx + 33.33); | |
return fract((p3.xx + p3.yz) * p3.zy); | |
} | |
vec3 hash31(float p) { | |
vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973)); | |
p3 += dot(p3, p3.yzx + 33.33); | |
return fract((p3.xxy + p3.yzz) * p3.zyx); | |
} | |
vec3 hash32(vec2 p) { | |
vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973)); | |
p3 += dot(p3, p3.yxz + 33.33); | |
return fract((p3.xxy + p3.yzz) * p3.zyx); | |
} | |
vec3 hash33(vec3 p3) { | |
p3 = fract(p3 * vec3(.1031, .1030, .0973)); | |
p3 += dot(p3, p3.yxz + 33.33); | |
return fract((p3.xxy + p3.yxx) * p3.zyx); | |
} | |
vec4 hash41(float p) { | |
vec4 p4 = fract(vec4(p) * vec4(.1031, .1030, .0973, .1099)); | |
p4 += dot(p4, p4.wzxy + 33.33); | |
return fract((p4.xxyz + p4.yzzw) * p4.zywx); | |
} | |
vec4 hash42(vec2 p) { | |
vec4 p4 = fract(vec4(p.xyxy) * vec4(.1031, .1030, .0973, .1099)); | |
p4 += dot(p4, p4.wzxy + 33.33); | |
return fract((p4.xxyz + p4.yzzw) * p4.zywx); | |
} | |
vec4 hash43(vec3 p) { | |
vec4 p4 = fract(vec4(p.xyzx) * vec4(.1031, .1030, .0973, .1099)); | |
p4 += dot(p4, p4.wzxy + 33.33); | |
return fract((p4.xxyz + p4.yzzw) * p4.zywx); | |
} | |
vec4 hash44(vec4 p4) { | |
p4 = fract(p4 * vec4(.1031, .1030, .0973, .1099)); | |
p4 += dot(p4, p4.wzxy + 33.33); | |
return fract((p4.xxyz + p4.yzzw) * p4.zywx); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment