Randomize and average sample wavelengths
This commit is contained in:
parent
eaa76a6b5d
commit
6ca3b84847
|
@ -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 {
|
||||
|
||||
|
@ -15,15 +16,23 @@ public class RayTracerSimple extends RayTracer {
|
|||
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];
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue