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.Color;
|
||||||
import xyz.marsavic.gfxlab.Vec3;
|
import xyz.marsavic.gfxlab.Vec3;
|
||||||
import xyz.marsavic.gfxlab.graphics3d.*;
|
import xyz.marsavic.gfxlab.graphics3d.*;
|
||||||
|
import xyz.marsavic.random.RNG;
|
||||||
|
|
||||||
public class RayTracerSimple extends RayTracer {
|
public class RayTracerSimple extends RayTracer {
|
||||||
|
|
||||||
|
@ -14,16 +15,24 @@ public class RayTracerSimple extends RayTracer {
|
||||||
public RayTracerSimple(Scene scene, Camera camera) {
|
public RayTracerSimple(Scene scene, Camera camera) {
|
||||||
super(scene, camera);
|
super(scene, camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RNG rng = new RNG();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Color sample(Ray ray) {
|
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) {
|
protected Color sample(Ray ray, int depthRemaining) {
|
||||||
double x = 0.0, y = 0.0, z = 0.0;
|
double x = 0.0, y = 0.0, z = 0.0;
|
||||||
for (int i = 0; i < spectrumSamples; i++) {
|
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);
|
double intensity = sample(ray, depthRemaining, wavelength);
|
||||||
|
|
||||||
x += intensity * Xyz.x[(int) wavelength];
|
x += intensity * Xyz.x[(int) wavelength];
|
||||||
|
|
|
@ -4,6 +4,7 @@ package xyz.marsavic.gfxlab.graphics3d.scene;
|
||||||
import javafx.util.Pair;
|
import javafx.util.Pair;
|
||||||
import xyz.marsavic.functions.interfaces.F1;
|
import xyz.marsavic.functions.interfaces.F1;
|
||||||
import xyz.marsavic.geometry.Vector;
|
import xyz.marsavic.geometry.Vector;
|
||||||
|
import xyz.marsavic.gfxlab.Color;
|
||||||
import xyz.marsavic.gfxlab.Spectrum;
|
import xyz.marsavic.gfxlab.Spectrum;
|
||||||
import xyz.marsavic.gfxlab.SplineSpectrum;
|
import xyz.marsavic.gfxlab.SplineSpectrum;
|
||||||
import xyz.marsavic.gfxlab.Vec3;
|
import xyz.marsavic.gfxlab.Vec3;
|
||||||
|
@ -32,21 +33,20 @@ public class SpectrumTest extends Scene.Base {
|
||||||
Collection<Solid> solids = new ArrayList<>();
|
Collection<Solid> solids = new ArrayList<>();
|
||||||
Collections.addAll(solids,
|
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), 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, 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, -2, 10), Vec3.xyz( 0, 1, 0), materialUVWallsL),
|
||||||
|
|
||||||
HalfSpace.pn(Vec3.xyz( 0, 0, 8), Vec3.xyz(0, 1, -1), uv -> Material.GLASS.refractiveIndex(
|
HalfSpace.pn(Vec3.xyz( 0, 0, 8), Vec3.xyz(0.3, 1, -1), uv -> Material.GLASS.refractiveIndex(
|
||||||
// w -> 1.6 + (w-400)/(800-400) * (1.55 - 1.6)
|
w -> 5.6 + (w-400)/(800-400) * (1.55 - 5.6)
|
||||||
w -> 1.5
|
|
||||||
)),
|
)),
|
||||||
HalfSpace.pn(Vec3.xyz( 0, 0, -6), Vec3.xyz( 0, 0, 1), materialUVWallsR)
|
HalfSpace.pn(Vec3.xyz( 0, 0, -6), Vec3.xyz( 0, 0, 1), materialUVWallsR)
|
||||||
);
|
);
|
||||||
|
|
||||||
Collections.addAll(lights,
|
Collections.addAll(lights,
|
||||||
Light.ps(Vec3.xyz(0, 1.0, -1.0), w -> 1.0),
|
Light.ps(Vec3.xyz(0, 1.0, -1.0), Spectrum.WHITE),
|
||||||
Light.ps(Vec3.xyz(0, -1.0, 9.0), w -> 1.0)
|
Light.ps(Vec3.xyz(0, -1.0, 8.0), Spectrum.WHITE)
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
solid = Group.of(solids);
|
solid = Group.of(solids);
|
||||||
|
|
Loading…
Reference in a new issue