diff --git a/example_scenes/cube.psy b/example_scenes/cube.psy index 93a6ed0..e3cc55c 100644 --- a/example_scenes/cube.psy +++ b/example_scenes/cube.psy @@ -9,8 +9,8 @@ Scene $Scene_fr1 { } Camera { Fov [49.134342] - FocalDistance [0.000000] - ApertureRadius [0.000000] + FocalDistance [9.559999] + ApertureRadius [0.250000] Transform [0.685881 0.727634 -0.010817 0.000000 -0.317370 0.312469 0.895343 0.000000 -0.654862 0.610666 -0.445245 0.000000 7.481132 -6.507640 5.343665 1.000000] } World { @@ -24,6 +24,15 @@ Scene $Scene_fr1 { Type [Lambert] Color [0.800000 0.800000 0.800000] } + MeshSurface $__Plane_ { + Vertices [-1.000000 -1.000000 0.000000 1.000000 -1.000000 0.000000 -1.000000 1.000000 0.000000 1.000000 1.000000 0.000000] + FaceVertCounts [4 ] + FaceVertIndices [0 1 3 2 ] + } + Instance { + Data [$__Plane_] + Transform [0.078868 -0.000000 0.000000 -0.000000 -0.000000 0.078868 -0.000000 0.000000 0.000000 -0.000000 0.078868 -0.000000 -0.000000 0.000000 -0.000000 1.000000] + } MeshSurface $__Cube_ { Vertices [1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 0.999999 1.000000 0.999999 -1.000001 1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 ] FaceVertCounts [4 4 4 4 4 4 ] @@ -32,15 +41,15 @@ Scene $Scene_fr1 { Instance { Data [$__Cube_] SurfaceShaderBind [$Material] - Transform [1.000000 -0.000000 0.000000 -0.000000 -0.000000 1.000000 -0.000000 0.000000 0.000000 -0.000000 1.000000 -0.000000 -0.000000 0.000000 -0.000000 1.000000] - } - SphereLight $__Lamp { - Color [100.000000 100.000000 100.000000] - Radius [0.100000] - } - Instance { - Data [$__Lamp] - Transform [-0.290865 -0.771101 0.566393 -0.000000 0.955171 -0.199883 0.218391 -0.000000 -0.055189 0.604525 0.794672 -0.000000 0.551084 -0.224861 -7.219975 1.000000] + Transform [1.000000 -0.000000 0.000000 -0.000000 -0.000000 1.000000 -0.000000 0.000000 0.000000 -0.000000 1.000000 -0.000000 -0.000000 0.000000 -1.000000 1.000000] } + #SphereLight $__Lamp { + # Color [50.000000 50.000000 50.000000] + # Radius [0.100000] + #} + #Instance { + # Data [$__Lamp] + # Transform [0.019856 -0.060763 0.000000 -0.000000 0.015191 0.079422 -0.000000 0.000000 0.000000 -0.000000 1.000000 -0.000000 -0.026851 -0.125233 -4.432303 1.000000] + #} } } diff --git a/src/renderer.rs b/src/renderer.rs index a0d82f4..c53b317 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -23,10 +23,18 @@ impl Renderer { let mut tracer = Tracer::from_assembly(&self.scene.root); let mut img = Image::new(self.resolution.0, self.resolution.1); - // Render image of ray-traced triangle + // Pre-calculate some useful values related to the image plane let cmpx = 1.0 / self.resolution.0 as f32; let cmpy = 1.0 / self.resolution.1 as f32; + let min_x = -1.0; + let max_x = 1.0; + let min_y = -(self.resolution.1 as f32 / self.resolution.0 as f32); + let max_y = self.resolution.1 as f32 / self.resolution.0 as f32; + let x_extent = max_x - min_x; + let y_extent = max_y - min_y; + + // Render for y in 0..img.height() { for x in 0..img.width() { let offset = hash_u32(((x as u32) << 16) ^ (y as u32), 0); @@ -35,10 +43,13 @@ impl Renderer { rays.clear(); for si in 0..self.spp { let mut ray = { - let filter_x = fast_logit(halton::sample(3, offset + si as u32), 1.5); - let filter_y = fast_logit(halton::sample(4, offset + si as u32), 1.5); - self.scene.camera.generate_ray((x as f32 + filter_x) * cmpx - 0.5, - (y as f32 + filter_y) * cmpy - 0.5, + let filter_x = fast_logit(halton::sample(3, offset + si as u32), 1.5) + 0.5; + let filter_y = fast_logit(halton::sample(4, offset + si as u32), 1.5) + 0.5; + let samp_x = (filter_x + x as f32) * cmpx; + let samp_y = (filter_y + y as f32) * cmpy; + + self.scene.camera.generate_ray((samp_x - 0.5) * x_extent, + (0.5 - samp_y) * y_extent, halton::sample(0, offset + si as u32), halton::sample(1, offset + si as u32), halton::sample(2, offset + si as u32))