diff options
Diffstat (limited to 'src/main/resources/shaders')
| -rw-r--r-- | src/main/resources/shaders/modules/utils.glsl | 10 | ||||
| -rw-r--r-- | src/main/resources/shaders/vase.glsl | 314 |
2 files changed, 324 insertions, 0 deletions
diff --git a/src/main/resources/shaders/modules/utils.glsl b/src/main/resources/shaders/modules/utils.glsl index 961480f..090e017 100644 --- a/src/main/resources/shaders/modules/utils.glsl +++ b/src/main/resources/shaders/modules/utils.glsl @@ -9,6 +9,16 @@ float ssubtract(float a, float b, float k) { return -smin(-a, b, k); } +float rotational_repetition(vec2 p, int n, inout vec2 p1, inout vec2 p2) { + float del = 2. * PI / float(n); + float theta = atan(p.y, p.x); + float id = floor(theta / del); + float id2 = id + 1.; + p1 = mat2(cos(del * id), -sin(del * id), sin(del * id), cos(del * id)) * p; + p2 = mat2(cos(del * id2), -sin(del * id2), sin(del * id2), cos(del * id2)) * p; + return id; +} + // Easing float ease_in_out_quart(in float x) { return x < 0.5 ? 8 * x * x * x * x : 1 - pow(-2 * x + 2, 4) / 2; 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)); +} |
