summaryrefslogtreecommitdiff
path: root/shaders/clouds.kage
diff options
context:
space:
mode:
Diffstat (limited to 'shaders/clouds.kage')
-rw-r--r--shaders/clouds.kage132
1 files changed, 132 insertions, 0 deletions
diff --git a/shaders/clouds.kage b/shaders/clouds.kage
new file mode 100644
index 0000000..26597e5
--- /dev/null
+++ b/shaders/clouds.kage
@@ -0,0 +1,132 @@
+//go:build ignore
+
+//kage:unit pixels
+
+package main
+
+var Time float
+
+const cloudscale = 0.8
+const speed = 0.01
+const clouddark = 0.6
+const cloudlight = 0.3
+const cloudcover = 0.2
+const cloudalpha = 8.0
+const skytint = 0.5
+
+func rand(co vec2) float {
+ return fract(sin(dot(co.xy, vec2(12.9898,-78.233))) * 43758.5453)
+}
+
+func hash( p vec2 ) vec2 {
+ p = vec2(dot(p,vec2(127.1,311.7)), dot(p,vec2(269.5,183.3)))
+ return -1.0 + 2.0*fract(sin(p)*43758.5453123)
+}
+
+func noise( p vec2 ) float {
+ const K1 = 0.366025404
+ const K2 = 0.211324865
+ i := floor(p + (p.x+p.y)*K1);
+ a := p - i + (i.x+i.y)*K2
+
+ var o vec2
+ if (a.x>a.y) {
+ o = vec2(1.0,0.0)
+ } else {
+ o = vec2(0.0,1.0)
+ }
+
+ b := a - o + K2
+ c := a - 1.0 + 2.0*K2
+ h := max(0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0)
+ n := h*h*h*h*vec3( dot(a,hash(i+0.0)), dot(b,hash(i+o)), dot(c,hash(i+1.0)))
+ return dot(n, vec3(70.0))
+}
+
+
+
+func fbm(n vec2) float {
+ v := n
+ total := 0.0
+ amplitude := 0.1
+ for i := 0; i < 7; i++ {
+ total += noise(v) * amplitude
+ v = mat2(1.6, 1.2, -1.2, 1.6) * v
+ amplitude *= 0.4
+ }
+ return total
+}
+
+func Fragment(dstPos vec4, srcPos vec2, color vec4) vec4 {
+ m := mat2(1.6, 1.2, -1.2, 1.6)
+ skycolour1 := vec3(0.45, 0.57, 0.66)
+ skycolour2 := vec3(0.55, 0.77, 0.86)
+
+ p := srcPos.xy / imageSrc0Size().xy;
+ uv := p*vec2(imageSrc0Size().x/imageSrc0Size().y,1.0);
+ time := Time * speed
+ q := fbm(uv * cloudscale * 0.5)
+
+ //ridged noise shape
+ r := 0.0
+ uv *= cloudscale
+ uv.x -= q - time
+ weight := 0.8
+ for i:=0; i<8; i++{
+ r += abs(weight*noise( uv ))
+ uv = m*uv + time
+ weight *= 0.7
+ }
+
+ //noise shape
+ f := 0.0
+ uv = p*vec2(imageSrc0Size().x/imageSrc0Size().y,1.0);
+ uv *= cloudscale
+ uv.x -= q - time
+ weight = 0.7
+ for i:=0;i<8;i++{
+ f += weight*noise( uv )
+ uv = m*uv + time
+ weight *= 0.6
+ }
+
+ f *= r + f
+
+ //noise colour
+ c := 0.0
+ time = Time * speed * 2.0
+ uv = p*vec2(imageSrc0Size().x/imageSrc0Size().y,1.0)
+ uv *= cloudscale*2.0
+ uv.x -= q - time
+ weight = 0.4
+ for i:=0;i<7;i++{
+ c += weight*noise( uv )
+ uv = m*uv + time
+ weight *= 0.6
+ }
+
+ //noise ridge colour
+ c1 := 0.0
+ time = Time * speed * 3.0
+ uv = p*vec2(imageSrc0Size().x/imageSrc0Size().y,1.0)
+ uv *= cloudscale*3.0
+ uv.x -= q - time
+ weight = 0.4
+ for i:=0; i<7; i++{
+ c1 += abs(weight*noise( uv ))
+ uv = m*uv + time
+ weight *= 0.6
+ }
+
+ c += c1
+
+ skycolour := mix(skycolour2, skycolour1, p.y);
+ cloudcolour := vec3(1.1, 1.1, 0.9) * clamp((clouddark + cloudlight*c), 0.0, 1.0);
+
+ f = cloudcover + cloudalpha*f*r;
+
+ result := mix(skycolour, clamp(skytint * skycolour + cloudcolour, 0.0, 1.0), clamp(f + c, 0.0, 1.0));
+
+ return vec4( result, 1.0 );
+}
+