diff options
Diffstat (limited to 'workspaces/main/shaders')
| -rw-r--r-- | workspaces/main/shaders/sdf_test.wgsl | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/workspaces/main/shaders/sdf_test.wgsl b/workspaces/main/shaders/sdf_test.wgsl new file mode 100644 index 0000000..3c97613 --- /dev/null +++ b/workspaces/main/shaders/sdf_test.wgsl @@ -0,0 +1,68 @@ +// SDF Test Effect - demonstrates SDFEffect base class usage +// Simple scene with a sphere and box + +#include "common_uniforms" +#include "camera_common" +#include "math/sdf_shapes" +#include "render/raymarching" + +@group(0) @binding(0) var<uniform> uniforms: CommonUniforms; +@group(0) @binding(1) var<uniform> camera: CameraParams; + +// Scene distance function +fn df(p: vec3<f32>) -> f32 { + // Animated sphere + let sphere_pos = vec3<f32>(sin(uniforms.beat_time * 0.5) * 2.0, 0.0, 0.0); + let d_sphere = sdSphere(p - sphere_pos, 1.0); + + // Static box + let box_pos = vec3<f32>(0.0, -2.0, 0.0); + let d_box = sdBox(p - box_pos, vec3<f32>(3.0, 0.5, 3.0)); + + return min(d_sphere, d_box); +} + +// Simple lighting +fn shade(pos: vec3<f32>, rd: vec3<f32>) -> vec3<f32> { + let n = normal(pos); + let light_dir = normalize(vec3<f32>(1.0, 1.0, -1.0)); + let diff = max(dot(n, light_dir), 0.0); + let amb = 0.2; + + // Color based on position + let col = mix(vec3<f32>(0.2, 0.6, 0.9), vec3<f32>(0.9, 0.3, 0.2), + smoothstep(-2.0, 2.0, pos.x)); + + return col * (diff + amb); +} + +@vertex +fn vs_main(@builtin(vertex_index) vid: u32) -> @builtin(position) vec4<f32> { + // Fullscreen triangle + let x = f32((vid & 1u) << 2u) - 1.0; + let y = f32((vid & 2u) << 1u) - 1.0; + return vec4<f32>(x, y, 0.0, 1.0); +} + +@fragment +fn fs_main(@builtin(position) pos: vec4<f32>) -> @location(0) vec4<f32> { + // UV coordinates (-1 to 1) + let uv = (pos.xy / uniforms.resolution - 0.5) * 2.0; + + // Generate ray + let ray = getCameraRay(camera, uv); + + // Raymarch + let t = rayMarch(ray.origin, ray.direction, 0.0); + + // Background color + var col = vec3<f32>(0.1, 0.1, 0.15); + + // Shade hit point + if (t < MAX_RAY_LENGTH) { + let hit_pos = ray.origin + ray.direction * t; + col = shade(hit_pos, ray.direction); + } + + return vec4<f32>(col, 1.0); +} |
