summaryrefslogtreecommitdiff
path: root/common/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'common/shaders')
-rw-r--r--common/shaders/camera_common.wgsl52
1 files changed, 52 insertions, 0 deletions
diff --git a/common/shaders/camera_common.wgsl b/common/shaders/camera_common.wgsl
new file mode 100644
index 0000000..bd29775
--- /dev/null
+++ b/common/shaders/camera_common.wgsl
@@ -0,0 +1,52 @@
+// Camera parameters and helpers for SDF raymarching effects
+
+struct CameraParams {
+ inv_view: mat4x4<f32>,
+ fov: f32,
+ near_plane: f32,
+ far_plane: f32,
+ aspect_ratio: f32,
+}
+
+struct Ray {
+ origin: vec3<f32>,
+ direction: vec3<f32>,
+}
+
+// Generate camera ray for given UV coordinates (-1 to 1)
+fn getCameraRay(cam: CameraParams, uv: vec2<f32>) -> Ray {
+ let cam_pos = vec3<f32>(cam.inv_view[3].x, cam.inv_view[3].y, cam.inv_view[3].z);
+
+ // Compute ray direction from FOV and aspect ratio
+ let tan_fov = tan(cam.fov * 0.5);
+ let ndc = vec3<f32>(uv.x * cam.aspect_ratio * tan_fov, uv.y * tan_fov, -1.0);
+
+ // Transform direction by inverse view matrix (rotation only)
+ let dir = normalize(
+ cam.inv_view[0].xyz * ndc.x +
+ cam.inv_view[1].xyz * ndc.y +
+ cam.inv_view[2].xyz * ndc.z
+ );
+
+ return Ray(cam_pos, dir);
+}
+
+// Extract camera position from inverse view matrix
+fn getCameraPosition(cam: CameraParams) -> vec3<f32> {
+ return vec3<f32>(cam.inv_view[3].x, cam.inv_view[3].y, cam.inv_view[3].z);
+}
+
+// Extract camera forward vector (view direction)
+fn getCameraForward(cam: CameraParams) -> vec3<f32> {
+ return -normalize(vec3<f32>(cam.inv_view[2].x, cam.inv_view[2].y, cam.inv_view[2].z));
+}
+
+// Extract camera up vector
+fn getCameraUp(cam: CameraParams) -> vec3<f32> {
+ return normalize(vec3<f32>(cam.inv_view[1].x, cam.inv_view[1].y, cam.inv_view[1].z));
+}
+
+// Extract camera right vector
+fn getCameraRight(cam: CameraParams) -> vec3<f32> {
+ return normalize(vec3<f32>(cam.inv_view[0].x, cam.inv_view[0].y, cam.inv_view[0].z));
+}