diff --git a/notes/camera.md b/notes/camera.md new file mode 100644 index 0000000..ff4a27c --- /dev/null +++ b/notes/camera.md @@ -0,0 +1,18 @@ +# `Camera` coordinate system + +The `Camera` class contains a coordinate system that can be used to generate rays using the thin-lens approximation for depth of field effects. Note: `right`, `up` are just normalized `horizontal`, `vertical` vectors. + +![camera-coordinates](img/camera.jpg) + +```rust +// A WGSL shader example of how to generate a ray using `Camera`. +fn generateCameraRay(camera: Camera, rngState: ptr, u: f32, v: f32) -> Ray { + let randomPointInAperture = camera.lensRadius * randomVec3InUnitDisk(rngState); + let lensOffset = randomPointInAperture.x * camera.right + randomPointInAperture.y * camera.up; + + let origin = camera.origin + lensOffset; + let direction = camera.lowerLeftCorner + u * camera.horizontal + v * camera.vertical - origin; + + return Ray(origin, direction); +} +``` diff --git a/notes/img/camera.jpg b/notes/img/camera.jpg new file mode 100644 index 0000000..cd6ac1c Binary files /dev/null and b/notes/img/camera.jpg differ diff --git a/src/pt/raytracer.wgsl b/src/pt/raytracer.wgsl index c56d22c..56c8a37 100644 --- a/src/pt/raytracer.wgsl +++ b/src/pt/raytracer.wgsl @@ -60,7 +60,7 @@ struct FrameData { } struct Camera { - eye: vec3f, + origin: vec3f, lowerLeftCorner: vec3f, horizontal: vec3f, vertical: vec3f, @@ -121,7 +121,7 @@ fn rayColor(primaryRay: Ray, rngState: ptr) -> vec3f { } fn generateCameraRay(camera: Camera, rngState: ptr, u: f32, v: f32) -> Ray { - let origin = camera.eye; + let origin = camera.origin; let direction = camera.lowerLeftCorner + u * camera.horizontal + v * camera.vertical - origin; return Ray(origin, direction);