aboutsummaryrefslogtreecommitdiff
path: root/src/main/resources/shaders/vase.glsl
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2026-10-09 01:12:51 +0530
committerAkshay Nair <phenax5@gmail.com>2026-10-09 01:12:51 +0530
commitffb3a21f18823d7e0d649b390c9a11576c04cb92 (patch)
tree38e544f7f889f1d0bac1d77474fe4c433b29d8e1 /src/main/resources/shaders/vase.glsl
parent56a6b43ec8509012755c9d63608fb98155b52a9a (diff)
downloadart-playground-openrndr-ffb3a21f18823d7e0d649b390c9a11576c04cb92.tar.gz
art-playground-openrndr-ffb3a21f18823d7e0d649b390c9a11576c04cb92.zip
Add vase
Diffstat (limited to '')
-rw-r--r--src/main/resources/shaders/vase.glsl314
1 files changed, 314 insertions, 0 deletions
diff --git a/src/main/resources/shaders/vase.glsl b/src/main/resources/shaders/vase.glsl
new file mode 100644
index 0000000..80e4105
--- /dev/null
+++ b/src/main/resources/shaders/vase.glsl
@@ -0,0 +1,314 @@
+#version 430
+layout(local_size_x = 1, local_size_y = 1) in;
+
+#include <sdf>
+#include <utils>
+#include <noise>
+
+uniform float seconds = 0;
+layout(rgba8) uniform readonly image2D text_texture;
+layout(rgba8) uniform writeonly image2D output_image;
+
+uniform float antialiasing = 0.28;
+uniform bool enable_antialiasing = false;
+
+float digit(in vec2 uv, in int dig, in float size) {
+ vec2 p = uv * 5000 / size;
+ float digitSize = imageSize(text_texture).x / 10.;
+ float digitOffset = digitSize * dig;
+ p.x = clamp(p.x + digitOffset, digitOffset, digitOffset + digitSize);
+ vec4 s = imageLoad(text_texture, ivec2(p));
+ return s.w;
+}
+
+float leaf_veins(in vec2 p) {
+ float root = abs(p.y) - 0.022 * (1.0 - 0.7 * p.x);
+ p.y = abs(p.y) - p.x;
+ p.y = abs(p.y) - 0.20 * (p.x + 1.0);
+ p.y = abs(p.y) - 0.11 * (p.x + 0.6);
+ float veins = abs(p.y) - 0.022 * (1.0 - 0.9 * p.x);
+ return min(root, veins);
+}
+
+vec3 image(vec2 uv) {
+ const vec3 wall_color = srgb(0.70, 0.78, 0.64);
+ const vec3 clock_hands_color = srgb(0.1, 0.2, 0.1);
+ const vec3 vase_color = srgb(0.31, 0.22, 0.21);
+ const vec3 vase_pat_color = mix(vase_color, vec3(0), 0.6);
+ const vec3 floor_color = srgb(0.21, 0.218, 0.21);
+ const vec3 petal_color = srgb(0.82, 0.36, 0.40);
+ const vec3 pistal_color = srgb(0.63, 0.60, 0.33);
+ const vec3 stem_color = srgb(0.18, 0.45, 0.22);
+ const vec3 leaf_color = srgb(0.18, 0.45, 0.22);
+ const vec3 frame_color = srgb(0.43, 0.30, 0.25);
+ const vec3 dried_flower_color = srgb(0.34, 0.20, 0.0);
+
+ vec3 color = wall_color;
+ color = mix(color, mix(wall_color, vec3(0), 0.2), step(fbm(uv * 800), 0.24));
+ vec2 patp = uv * vec2(1, 1.5);
+ vec3 shaded_floor_color = mix(floor_color,
+ mix(floor_color, vec3(1), 0.1),
+ clamp(fbm(100 * patp * fbm(10 * patp)) - 0.6, 0, 1));
+ color = mix(color, shaded_floor_color, step(uv.y, -0.16));
+
+ {
+ const vec3 c1color = vec3(0.98, 0.66, 0.15);
+ const vec3 c2color = vec3(0.26, 0.63, 0.28);
+ const vec3 c3color = vec3(0.78, 0.16, 0.16);
+ const vec3 c4color = vec3(0.13, 0.37, 0.60);
+
+ vec2 framep = uv - vec2(-0.36, 0.26);
+ float frame = sdf_box(framep, vec2(0.1), 0.006);
+ color = mix(color, vec3(0), 1 - smoothstep(-0.01, 0.01, frame));
+ color = mix(color, mix(frame_color, vec3(0), 0.4), step(frame, 0));
+ color = mix(color, frame_color, step(frame + 0.007, 0));
+ color = mix(color, mix(frame_color, vec3(0), 0.4), step(frame + 0.025, 0));
+ float padd = sdf_box(framep, vec2(0.07), 0);
+ float framecut = max(frame, -padd - 0.02);
+ color = mix(color, vec3(0.8), step(padd, 0));
+ color = mix(color, c1color, step(padd, -0.02));
+ {
+ vec2 p = framep * 30;
+ float theta = atan(p.y, p.x);
+ float art = (p.y / sin(theta)) - sin(2 * theta);
+ float art2 = (p.y / sin(theta)) - 1.6 * sin(6 * theta);
+ color = mix(color, c2color, (1 - step(framecut, 0)) * step(art2, 0));
+ color = mix(color, c2color, (1 - step(framecut, 0)) * step(art, 1.4));
+ color = mix(color, c4color, (1 - step(framecut, 0)) * step(art, 0.8));
+ color = mix(color, c3color, (1 - step(framecut, 0)) * step(art, 0.4));
+ color = mix(color, c1color, (1 - step(framecut, 0)) * step(art, 0));
+ }
+ }
+
+ { // clok
+ vec2 clockp = uv - vec2(0.3, 0.26);
+ float clock = sdf_circle(clockp, 0.06);
+ color = mix(color, vec3(0), 1 - smoothstep(-0.05, 0.05, clock));
+ color = mix(color, srgb(0.34), step(clock, 0.02));
+ color = mix(color, srgb(0.28), step(clock, 0.004));
+ color = mix(color, vec3(1), step(clock, 0));
+
+ {
+ vec2 digitp = clockp - vec2(0.0064, 0.022);
+ float r = 0.046;
+ float digit_size = 0.44;
+ float angle = PI / 6.;
+ for (int i = 0; i < 12; i++) {
+ vec2 digitpos = digitp + vec2(0.011, 0.036) - r * vec2(cos(-i * angle + PI / 3), sin(-i * angle + PI / 3));
+ float s = 0;
+ if (i + 1 >= 10) {
+ s = digit(digitpos + vec2(0.0034, 0), 1, digit_size);
+ digitpos.x -= 0.0034;
+ }
+ s = max(s, digit(digitpos, (i + 1) % 10, digit_size));
+ color = mix(color, mix(vec3(0), color, 0.4), s);
+ }
+ }
+
+ {
+ float theta = -PI - PI / 6;
+ vec2 hhp = clockp;
+ hhp *= mat2x2(cos(theta), -sin(theta), sin(theta), cos(theta));
+ float handh = sdf_box(hhp - vec2(0.013, 0), vec2(0.012, 0.0024), 0.006);
+ color = mix(color, clock_hands_color, step(handh, 0));
+ }
+ {
+ float theta = -PI / 2;
+ vec2 hmp = clockp;
+ hmp *= mat2x2(cos(theta), -sin(theta), sin(theta), cos(theta));
+ float handm = sdf_box(hmp - vec2(0.016, 0), vec2(0.020, 0.0013), 0.0018);
+ color = mix(color, clock_hands_color, step(handm, 0));
+ }
+ color = mix(color, clock_hands_color, step(sdf_circle(clockp, 0.004), 0));
+ }
+
+ vec2 vasep = uv - vec2(0.0, -0.18);
+ float vase_shadow = sdf_circle((vasep + vec2(0.05, 0.176)) * vec2(0.2, 1) / 0.2, 0.062);
+ color = mix(color, srgb(0.16), 1 - smoothstep(-0.01, 0.1, vase_shadow));
+ vec2 vase_openingp = vasep - vec2(0, 0.176);
+ float vase_opening_pad = 0.01;
+ float vase = sdf_box(vasep, vec2(0.08 + 0.02 * sin(23 * vasep.y + 1.9), 0.18), 0.01);
+ float vase_opening = sdf_circle(vase_openingp * vec2(0.2, 1) / 0.2, 0.07);
+ vase = min(vase, vase_opening);
+ float vase_base = sdf_circle((vasep + vec2(0, 0.176)) * vec2(0.2, 1) / 0.2, 0.062);
+ vase = min(vase, vase_base);
+ color = mix(color, vase_color, step(vase, 0));
+
+ float vase_opening_cut = max(-vase_opening - vase_opening_pad, vase_openingp.y);
+
+ { // vase
+ vec2 patp = vasep - vec2(0, 0.11);
+ float gap = 0.12;
+ float id = round(patp.y / gap);
+ patp.y -= gap * id;
+ patp = patp - vec2(0, 0.16 * abs(sin(vasep.x)));
+ float fun = cos(patp.x * 200) / 180.;
+ float thicc = 0.0018;
+ float pat = min(abs(patp.y - fun) - thicc, abs(-patp.y - fun) - thicc);
+ color = mix(color, vase_pat_color, step(vase, 0) * step(min(pat, sdf_circle(patp, 0.002)), 0));
+ color = mix(color, mix(vase_color, vec3(0), 0.4), step(vase_opening, -vase_opening_pad));
+ color = mix(color, mix(color, vec3(0), 0.5), step(vase, 0) * (1 - smoothstep(0.08, 0.17, sdf_circle(vasep + vec2(0.13, 0.09), 0.01))));
+ }
+
+ { // flower
+ vec2 p = uv - vec2(-0.01, 0.07);
+ { // stem
+ vec2 sp1 = p;
+ vec2 sp2 = vasep - vec2(2.0, 0);
+ float theta = -atan(sp2.y - sp1.y, sp2.x - sp1.x);
+ float stem = p.y - theta * p.x + 0.01;
+ color = mix(color, stem_color, (1 - step(vase_opening_cut, 0)) * step(max(-sp1.x, sp2.x - 0.06), 0) * step(abs(stem) - 0.006, 0));
+ }
+ vec2 fp1 = p * 20;
+ float tilt = 1.4;
+ vec2 fp2 = fp1 * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float theta1 = atan(fp1.y, fp1.x);
+ float theta2 = atan(fp2.y, fp2.x);
+ float r1 = max(fp1.y / sin(theta1), fp1.x / cos(theta1)); // to remove artifacts from r = inf
+ float r2 = max(fp2.y / sin(theta2), fp2.x / cos(theta2));
+ float petals = min(r2 - sin(6 * theta2), r1 - sin(6 * theta1));
+ color = mix(color, mix(petal_color, dried_flower_color, 0.5), step(min(petals, 1.3 * r1 - sin(12 * theta1)), 0));
+ color = mix(color, mix(petal_color, vec3(0), 0.6), step(petals + 0.4, 0));
+ float pistal = sdf_circle(fp1, 0.14);
+ vec3 piscolor = pistal_color;
+ piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal));
+ color = mix(color, piscolor, step(pistal, 0));
+ }
+
+ { // flower
+ vec2 p = uv - vec2(-0.10, 0.095);
+ { // stem
+ vec2 sp1 = p;
+ vec2 sp2 = vasep;
+ float theta = -atan(sp2.y - sp1.y, sp2.x - sp1.x);
+ float stem = p.y - theta * (p.x) + 0.08 * sin(p.y * 16);
+ color = mix(color, stem_color, (1 - step(vase_opening_cut, 0)) * step(max(-sp1.x, sp2.x - 0.06), 0) * step(abs(stem) - 0.006, 0));
+ }
+ vec2 fp1 = p * 20;
+ float tilt = 1.4;
+ vec2 fp2 = fp1 * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float theta1 = atan(fp1.y, fp1.x);
+ float theta2 = atan(fp2.y, fp2.x);
+ float r1 = max(fp1.y / sin(theta1), fp1.x / cos(theta1)); // to remove artifacts from r = inf
+ float r2 = max(fp2.y / sin(theta2), fp2.x / cos(theta2));
+ float petals = min(r2 - sin(6 * theta2), r1 - sin(6 * theta1));
+ color = mix(color, petal_color, step(min(petals, 1.3 * r1 - sin(12 * theta1)), 0));
+ color = mix(color, mix(petal_color, vec3(0), 0.5), step(petals + 0.4, 0));
+ float pistal = sdf_circle(fp1, 0.14);
+ vec3 piscolor = pistal_color;
+ piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal));
+ color = mix(color, piscolor, step(pistal, 0));
+ { // leaf
+ vec2 leafp = p - vec2(0.13, -0.01);
+ float tilt = 2.8;
+ leafp *= mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float leafveins = leaf_veins(-leafp * 20 + vec2(1.4, 0));
+ leafp.x = clamp(leafp.x, 0, 0.1);
+ float leaf = abs(leafp.y) - sin(32 * leafp.x) * sin(0.4 * leafp.x);
+ color = mix(color, leaf_color, step(leaf + 0.01, 0));
+ color = mix(color, mix(leaf_color, vec3(0), 0.2), step(leaf + 0.01, 0) * step(leafveins, 0));
+ }
+ }
+
+ { // flower
+ vec2 p = uv - vec2(-0.13, 0.04);
+ { // stem
+ vec2 sp1 = p;
+ vec2 sp2 = vasep;
+ float theta = -atan(sp2.y - sp1.y, sp2.x - sp1.x);
+ vec2 pt = p + vec2(0.05, 0.009);
+ float stem = pt.y - theta * (pt.x) + 0.09 * cos(pt.x * 26) - 0.14;
+ color = mix(color, stem_color, (1 - step(vase_opening_cut, 0)) * step(max(-sp1.x, sp2.x - 0.01), 0) * step(abs(stem) - 0.0024, 0));
+ }
+ vec2 fp = p * 20;
+ float tilt = 1.4;
+ vec2 fp1 = fp * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float theta = atan(fp.y, fp.x);
+ float r = fp.x / cos(theta);
+ theta = clamp(theta + PI, 0, PI);
+ float theta1 = atan(fp1.y, fp1.x);
+ float r1 = fp1.x / cos(theta1);
+ theta1 = clamp(theta1 + PI, PI / 4, 5 * PI / 4);
+ float petals = r - sin(6 * theta);
+ petals = min(petals, r1 - sin(6 * theta1));
+ petals = min(petals, 1.3 * r - sin(12 * clamp(theta, 0, PI / 2 + PI / 4)));
+ color = mix(color, mix(petal_color, vec3(0), -petals * 0.8), step(petals, 0));
+ {
+ vec2 budp = p + vec2(0.006, 0.006);
+ float tilt = 0.4;
+ budp *= mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float bud = max(-(budp.y - (0.003) * abs(-sin(budp.x * 500) + sin(budp.x * 600))),
+ sdf_circle(budp + vec2(0, 0.0078), 0.020));
+ color = mix(color, stem_color, step(bud, 0));
+ }
+ }
+
+ { // flower
+ vec2 p = uv - vec2(-0.036, 0.);
+ vec2 fp = p * 20;
+ float tilt = 1.4;
+ vec2 fp1 = fp * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float theta = atan(fp.y, fp.x);
+ float theta1 = atan(fp1.y, fp1.x);
+ float petals = min(fp1.x / cos(theta1) - sin(6 * theta1), fp.x / cos(theta) - sin(6 * theta));
+ color = mix(color, petal_color, step(min(petals, 1.3 * fp.x / cos(theta) - sin(12 * theta)), 0));
+ color = mix(color, mix(petal_color, vec3(0), 0.5), step(petals + 0.4, 0));
+ float pistal = sdf_circle(fp, 0.14);
+ vec3 piscolor = pistal_color;
+ piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal));
+ color = mix(color, piscolor, step(pistal, 0));
+ }
+
+ { // dead flower
+ vec2 p = uv - vec2(0.11, 0.00);
+ { // stem
+ vec2 sp1 = p;
+ vec2 sp2 = vasep;
+ float theta = atan(sp2.y - sp1.y, sp2.x - sp1.x);
+ float stem = p.y - 0.02 - theta * (p.x) + 0.08 * sin(p.x * 28 + 0.3);
+ vec3 dried_stem_color = srgb(0.36, 0.32, 0.0);
+ dried_stem_color = mix(dried_stem_color, vec3(0), fbm(p * 100));
+ color = mix(color, dried_stem_color, (1 - step(vase_opening_cut, 0)) * step(min(sp1.x, sp2.x), 0) * step(abs(stem) - 0.003, 0));
+ }
+ vec2 fp = p * 20 + vec2(0, (p.y - 0.1) * fbm(p + 1));
+ float tilt = 1.4;
+ vec2 fp1 = fp * mat2x2(cos(tilt), -sin(tilt), sin(tilt), cos(tilt));
+ float theta = atan(fp.y, fp.x);
+ float theta1 = atan(fp1.y, fp1.x);
+ float petals = min(
+ fp1.x / cos(theta1) - sin(6 * theta1),
+ fp.x / cos(theta) - sin(6 * theta));
+ vec3 dried_flower_color = dried_flower_color;
+ dried_flower_color = mix(dried_flower_color, vec3(0), fbm(p * 100));
+ dried_flower_color = mix(dried_flower_color, color, step(fbm((p + vec2(0.8, 0.804)) * 20) - 0.3, 0));
+ color = mix(color, dried_flower_color, step(min(petals, 1.3 * fp.x / cos(theta) - sin(12 * theta)), 0));
+ color = mix(color, mix(dried_flower_color, vec3(0), 0.5), step(petals + 0.4, 0));
+ float pistal = sdf_circle(fp, 0.14);
+ vec3 piscolor = pistal_color;
+ piscolor = mix(piscolor, vec3(0), smoothstep(-0.14, 0.1, pistal));
+ color = mix(color, piscolor, step(pistal, 0));
+ }
+
+ return color;
+}
+
+vec3 antialiased_image(vec2 uv) {
+ vec2 resolution = vec2(imageSize(output_image).xy);
+ float s = antialiasing / max(resolution.x, resolution.y);
+ vec3 sum = vec3(0);
+ int count = 0;
+ for (int i = -2; i < 2; i++)
+ for (int j = -2; j < 2; j++, count++)
+ sum += image(uv + vec2(i, j) * s);
+ return sum / count;
+}
+
+void main() {
+ vec2 resolution = vec2(imageSize(output_image).xy);
+ float aspect_ratio = resolution.y / resolution.x;
+ vec2 uv = (gl_GlobalInvocationID.xy - resolution / 2) * vec2(1.0, aspect_ratio) / resolution;
+
+ vec3 color = enable_antialiasing ? antialiased_image(uv) : image(uv);
+
+ imageStore(output_image, ivec2(gl_GlobalInvocationID.xy), vec4(color, 1));
+}