From 27cdbbd15948f30c6697445084970dac920f6f13 Mon Sep 17 00:00:00 2001 From: kappa Date: Wed, 27 Sep 2023 19:27:19 +0200 Subject: [PATCH] Include clamp for XYZ to RGB conversion --- src/xyz/marsavic/gfxlab/Color.java | 9 ++++ .../marsavic/gfxlab/graphics3d/Material.java | 10 ++--- .../raytracers/RayTracerSimple.java | 20 +++------ .../gfxlab/graphics3d/scene/SpectrumTest.java | 43 +++++++------------ .../marsavic/gfxlab/playground/GfxLab.java | 1 - 5 files changed, 35 insertions(+), 48 deletions(-) diff --git a/src/xyz/marsavic/gfxlab/Color.java b/src/xyz/marsavic/gfxlab/Color.java index c97df80..f48ae78 100644 --- a/src/xyz/marsavic/gfxlab/Color.java +++ b/src/xyz/marsavic/gfxlab/Color.java @@ -104,12 +104,21 @@ public class Color { return oklabPolar(v.x(), v.y(), v.z()); } + static double clipDoubleXyz(double x) { + if (x < 0.0) + return 0.0; + return x; + } public static Color xyz(double x, double y, double z) { double r = 3.2404542 * x - 1.5371385 * y - 0.4985314 * z; double g = -0.9692660 * x + 1.8760108 * y + 0.0415560 * z; double b = 0.0556434 * x - 0.2040259 * y + 1.0572252 * z; + r = clipDoubleXyz(r); + g = clipDoubleXyz(g); + b = clipDoubleXyz(b); + return Color.rgb(r,g,b); } diff --git a/src/xyz/marsavic/gfxlab/graphics3d/Material.java b/src/xyz/marsavic/gfxlab/graphics3d/Material.java index 4dd51d7..1d00e3c 100644 --- a/src/xyz/marsavic/gfxlab/graphics3d/Material.java +++ b/src/xyz/marsavic/gfxlab/graphics3d/Material.java @@ -14,11 +14,11 @@ public record Material( Spectrum refractiveIndex ) { - public Material diffuse (Spectrum diffuse) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } - public Material specular (Spectrum specular ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } - public Material shininess (double shininess ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } - public Material reflective (Spectrum reflective ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } - public Material refractive (Spectrum refractive ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } + public Material diffuse (Spectrum diffuse ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } + public Material specular (Spectrum specular ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } + public Material shininess (double shininess ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } + public Material reflective (Spectrum reflective ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } + public Material refractive (Spectrum refractive ) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } public Material refractiveIndex(Spectrum refractiveIndex) { return new Material(diffuse, specular, shininess, reflective, refractive, refractiveIndex); } // Since refractive index is a function from wavelength to a real number, it can be viewed as a spectrum diff --git a/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java b/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java index 2ece5b5..fb75055 100644 --- a/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java +++ b/src/xyz/marsavic/gfxlab/graphics3d/raytracers/RayTracerSimple.java @@ -10,16 +10,6 @@ public class RayTracerSimple extends RayTracer { private static final double minWavelength = 380; private static final double maxWavelength = 780; private static final double EPSILON = 1e-9; - private static final double maxXYZ; - - static { - double max = 0.0; - for (int i = 0; i < spectrumSamples; i++) { - double wavelength = minWavelength + (((double) i)/spectrumSamples)*(maxWavelength - minWavelength); - max += Xyz.x[(int) wavelength] + Xyz.y[(int) wavelength] + Xyz.z[(int) wavelength]; - } - maxXYZ = max; - } public RayTracerSimple(Scene scene, Camera camera) { super(scene, camera); @@ -101,11 +91,12 @@ public class RayTracerSimple extends RayTracer { if (reflective != 0.0) { // When material has reflective properties we recursively find the color visible along the ray (p, r). double lightReflected = sample(Ray.pd(p, r), depthRemaining - 1, wavelength); - result += material.reflective().at(wavelength) * lightReflected; + result += reflective * lightReflected; } - - if (material.refractive().at(wavelength) != 0.0) { + double refractive = material.refractive().at(wavelength); + if (refractive != 0.0) { + System.out.println(refractive + " " + ray); Vec3 b; // refracted light vector double rInd = 1/material.refractiveIndex().at(wavelength); @@ -128,7 +119,8 @@ public class RayTracerSimple extends RayTracer { b = bRejection.add(bProjection); } double lightRefracted = sample(Ray.pd(p, b), depthRemaining - 1, wavelength); - result = result + material.refractive().at(wavelength) * lightRefracted; + System.out.println("Light: " + lightRefracted + " direction: " + b); + result += refractive * lightRefracted; } return result; diff --git a/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java b/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java index b7fa3fe..44208b6 100644 --- a/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java +++ b/src/xyz/marsavic/gfxlab/graphics3d/scene/SpectrumTest.java @@ -2,6 +2,8 @@ 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.Spectrum; import xyz.marsavic.gfxlab.SplineSpectrum; import xyz.marsavic.gfxlab.Vec3; @@ -21,42 +23,27 @@ import java.util.Collections; public class SpectrumTest extends Scene.Base { public SpectrumTest() { - var materialUVWalls = Grid.standard(Spectrum.WHITE); + var materialUVWalls = (F1) (uv -> Material.matte(1.0)); SplineSpectrum s; - var materialUVWallsL = Grid.standard(s = new SplineSpectrum(new Pair[]{ - new Pair(450.0, 0.2), - new Pair(500.0, 0.27), - new Pair(550.0, 0.35), - new Pair(700.0, 0.8), - })); - var materialUVWallsR = Grid.standard(new SplineSpectrum(new Pair[]{ - new Pair(450.0, 0.1), - new Pair(500.0, 0.25), - new Pair(550.0, 0.2), - new Pair(650.0, 0.1), - })); + var materialUVWallsL = Grid.standard(w -> 0.2); + + var materialUVWallsR = Grid.standard(w -> 0.3); Collection solids = new ArrayList<>(); Collections.addAll(solids, - HalfSpace.pn(Vec3.xyz(-1, 0, 0), Vec3.xyz( 1, 0, 0), materialUVWallsL), - HalfSpace.pn(Vec3.xyz( 1, 0, 0), Vec3.xyz(-1, 0, 0), materialUVWallsR), - HalfSpace.pn(Vec3.xyz( 0, -1, 0), Vec3.xyz( 0, 1, 0), materialUVWalls), - HalfSpace.pn(Vec3.xyz( 0, 1, 0), Vec3.xyz( 0, -1, 0), materialUVWalls), - HalfSpace.pn(Vec3.xyz( 0, 0, 1), Vec3.xyz( 0, 0, -1), materialUVWalls), + HalfSpace.pn(Vec3.xyz(0, 0, 10), Vec3.xyz( 1, 0, -1), materialUVWallsL), + 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), - Ball.cr(Vec3.xyz(-0.3, 0.3, 0.0), 0.4, uv -> Material.GLASS.refractive(w->0.5)), - Ball.cr(Vec3.xyz( 0.4, -0.4, 0.0), 0.4, uv -> Material.GLASS.refractiveIndex( - w -> 2.6 + (w-400)/(800-400) * (1.55 - 2.6) - )) -// Ball.cr(Vec3.xyz(-0.3, -0.4, -0.6), 0.4, uv -> Material.GLASS.refractiveIndex(w -> 2.5)), -// Ball.cr(Vec3.xyz( 0.4, 0.3, 0.6), 0.4, uv -> Material.GLASS.refractiveIndex(w -> 0.6)) + HalfSpace.pn(Vec3.xyz( 0, 0, 8), Vec3.xyz(0, 0, -1), uv -> Material.GLASS), + HalfSpace.pn(Vec3.xyz( 0, 0, -6), Vec3.xyz( 0, 0, 1), materialUVWallsR) + +// Ball.cr(Vec3.xyz(0.0, 0.0, 5), 0.4, uv -> Material.MIRROR) ); Collections.addAll(lights, - Light.ps(Vec3.xyz(-0.7, 0.7, -0.7), Spectrum.WHITE), - Light.ps(Vec3.xyz(-0.7, 0.7, 0.7), Spectrum.WHITE), - Light.ps(Vec3.xyz( 0.7, 0.7, -0.7), Spectrum.WHITE), - Light.ps(Vec3.xyz( 0.7, 0.7, 0.7), Spectrum.WHITE) + Light.ps(Vec3.xyz(0, 0.0, -1.0), w -> 1.0) ); solid = Group.of(solids); diff --git a/src/xyz/marsavic/gfxlab/playground/GfxLab.java b/src/xyz/marsavic/gfxlab/playground/GfxLab.java index 8790b4f..82a5c0a 100644 --- a/src/xyz/marsavic/gfxlab/playground/GfxLab.java +++ b/src/xyz/marsavic/gfxlab/playground/GfxLab.java @@ -42,7 +42,6 @@ public class GfxLab { // e(Orthographic::new), e(Affine.IDENTITY .then(Affine.translation(Vec3.xyz(0, 0, -4))) -// .then(Affine.rotationAboutY(0.03)) ) ) ),