Randomize and average sample wavelengths

This commit is contained in:
kappa 2023-10-03 20:13:40 +02:00
parent eaa76a6b5d
commit 6ca3b84847
2 changed files with 19 additions and 10 deletions

View file

@ -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];

View file

@ -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<Solid> 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);