From 6ca3b84847334c34865a7ed567a811ec4764ed2c Mon Sep 17 00:00:00 2001 From: kappa Date: Tue, 3 Oct 2023 20:13:40 +0200 Subject: [PATCH] Randomize and average sample wavelengths --- .../graphics3d/raytracers/RayTracerSimple.java | 15 ++++++++++++--- .../gfxlab/graphics3d/scene/SpectrumTest.java | 14 +++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java b/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java index 3d06e4b..e391fce 100644 --- a/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java +++ b/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java @@ -3,6 +3,7 @@ package xyz.marsavic.gfxlab.graphics3d.raytracers; import xyz.marsavic.gfxlab.Color; import xyz.marsavic.gfxlab.Vec3; import xyz.marsavic.gfxlab.graphics3d.*; +import xyz.marsavic.random.RNG; public class RayTracerSimple extends RayTracer { @@ -14,16 +15,24 @@ public class RayTracerSimple extends RayTracer { public RayTracerSimple(Scene scene, Camera camera) { super(scene, camera); } - + + public static RNG rng = new RNG(); + @Override protected Color sample(Ray ray) { - return sample(ray, 64); + Color s = Color.BLACK; + int n = 5; + for (int i = 0; i < n; i++) { + s = s.add(sample(ray, 64)); + } + return s.div(n); + } protected Color sample(Ray ray, int depthRemaining) { double x = 0.0, y = 0.0, z = 0.0; for (int i = 0; i < spectrumSamples; i++) { - double wavelength = minWavelength + (((double) i)/spectrumSamples)*(maxWavelength - minWavelength); + double wavelength = minWavelength + (((double) i + rng.nextDouble())/spectrumSamples)*(maxWavelength - minWavelength); double intensity = sample(ray, depthRemaining, wavelength); x += intensity * Xyz.x[(int) wavelength]; diff --git a/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java b/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java index 2cf53ba..f10bfbe 100644 --- a/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java +++ b/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java @@ -4,6 +4,7 @@ package xyz.marsavic.gfxlab.graphics3d.scene; import javafx.util.Pair; import xyz.marsavic.functions.interfaces.F1; import xyz.marsavic.geometry.Vector; +import xyz.marsavic.gfxlab.Color; import xyz.marsavic.gfxlab.Spectrum; import xyz.marsavic.gfxlab.SplineSpectrum; import xyz.marsavic.gfxlab.Vec3; @@ -32,21 +33,20 @@ public class SpectrumTest extends Scene.Base { Collection solids = new ArrayList<>(); Collections.addAll(solids, HalfSpace.pn(Vec3.xyz(1, 0, 10), Vec3.xyz( 1, 0, -1), materialUVWallsL), - HalfSpace.pn(Vec3.xyz( -1, 0, 10), Vec3.xyz(-1, 0, -1), materialUVWallsR), + HalfSpace.pn(Vec3.xyz( 0, 0, 10), Vec3.xyz(-1, 0, -1), materialUVWallsR), HalfSpace.pn(Vec3.xyz(0, 2, 0), Vec3.xyz( 0, -1, 0), materialUVWallsL), HalfSpace.pn(Vec3.xyz(0, -2, 10), Vec3.xyz( 0, 1, 0), materialUVWallsL), - HalfSpace.pn(Vec3.xyz( 0, 0, 8), Vec3.xyz(0, 1, -1), uv -> Material.GLASS.refractiveIndex( -// w -> 1.6 + (w-400)/(800-400) * (1.55 - 1.6) - w -> 1.5 + HalfSpace.pn(Vec3.xyz( 0, 0, 8), Vec3.xyz(0.3, 1, -1), uv -> Material.GLASS.refractiveIndex( + w -> 5.6 + (w-400)/(800-400) * (1.55 - 5.6) + )), HalfSpace.pn(Vec3.xyz( 0, 0, -6), Vec3.xyz( 0, 0, 1), materialUVWallsR) ); Collections.addAll(lights, - Light.ps(Vec3.xyz(0, 1.0, -1.0), w -> 1.0), - Light.ps(Vec3.xyz(0, -1.0, 9.0), w -> 1.0) - + Light.ps(Vec3.xyz(0, 1.0, -1.0), Spectrum.WHITE), + Light.ps(Vec3.xyz(0, -1.0, 8.0), Spectrum.WHITE) ); solid = Group.of(solids);