From f84f9d996ecfa329b164a147246b4d917c0cf66a Mon Sep 17 00:00:00 2001 From: connellpaxton Date: Sun, 11 Feb 2024 10:34:08 -0500 Subject: [PATCH] Cantor --- Renderer/Renderer.cpp | 2 +- assets/shaders/manual.frag | 93 +++++++++++++++++++++++++++++++++ assets/shaders/manual.frag.spv | Bin 0 -> 6712 bytes 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 assets/shaders/manual.frag create mode 100644 assets/shaders/manual.frag.spv diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index 77fd9f9..7e07b54 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -199,7 +199,7 @@ Renderer::Renderer(Window& win) : win(win) { std::vector shaders = { {dev, "assets/shaders/ray.vert.spv", vk::ShaderStageFlagBits::eVertex }, - { dev, "assets/shaders/ray.frag.spv", vk::ShaderStageFlagBits::eFragment }, + { dev, "assets/shaders/manual.frag.spv", vk::ShaderStageFlagBits::eFragment }, }; std::vector bindings = { diff --git a/assets/shaders/manual.frag b/assets/shaders/manual.frag new file mode 100644 index 0000000..d565910 --- /dev/null +++ b/assets/shaders/manual.frag @@ -0,0 +1,93 @@ +#version 450 core + +#define MAX_STEPS 100 +#define MAX_DIST 1000.0 + +layout (set = 0, binding = 0) uniform Matrices { + vec3 cam_pos; + float time; + vec4 viewport; + vec3 cam_dir; + uint n_objects; +}; + +layout (location = 0) in vec2 pos; +layout (location = 0) out vec4 fragColor; + +/* joins two parts of a scene */ +float op_union(float v1, float v2) { + return min(v1, v2); +} + +/* subtracts sdf from scene */ +float op_subtract(float v1, float v2) { + return max(v1, -v2); +} + +float box(vec3 p, vec3 r) { + vec3 q = abs(p) - r; + return length(max(q,0.0)) + min(max(q.x, max(q.y,q.z)), 0.0); +} + +/* square, centered at the origin */ +float box(vec2 p, vec2 r) { + vec2 d = abs(p)-r; + return length(max(d, 0.0)) + min(max(d.x,d.y), 0.0); +} + +/* infinite cross, used for construction of serpinski cube */ +float infcross(vec3 p, float r) { + vec2 unit = vec2(r); + float box1 = box(p.xy, unit); + float box2 = box(p.yz, unit); + float box3 = box(p.zx, unit); + return op_union(op_union(box1, box2), box3); +} + +float sphere(vec3 p, float r) { + return length(p) - r; +} + +float sdf(vec3 p) { + float d = box(p, vec3(1.0)); + float s = 1.0; + for(int i = 0; i < 5; i++) { + /* using mod to repeat across domain, then shift to +- */ + vec3 a = mod(p * s, 2.0) - 1.0; + s *= 3.0; + vec3 r = 1.0 - 3.0*abs(a); + float c = infcross(r, 1.0)/s; + d = max(d, c); + } + return d; +} + +vec2 raycast(vec3 dir) { + float t = 0.0; + for(int i = 0; i < MAX_STEPS; i++) { + float dt = sdf(cam_pos + dir * t); + if(dt < 0.0001*t) + return vec2(t, float(i)); + /*else if(dt > MAX_DIST) + return vec2(t, float(i));*/ + t += dt; + } + + return vec2(0, 64.0); +} + +vec3 raygen() { + vec3 forward = cam_dir; + vec3 right = normalize(cross(forward, vec3(0.0, 1.0, 0.0))); + vec3 up = normalize(cross(right, forward)); + + return normalize(pos.x * right + pos.y * up + forward * 2.0); +} + +void main() { + vec3 dir = raygen(); + vec2 d = raycast(dir); + vec3 point = cam_pos + dir * d.x; + + fragColor = vec4(d.y/MAX_STEPS); +} \ No newline at end of file diff --git a/assets/shaders/manual.frag.spv b/assets/shaders/manual.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..322b6cd1aa0a032d7cf2db89f37767f87a24bcda GIT binary patch literal 6712 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 Z1