add probability density function based materials
parent
5f1e816edd
commit
6b47f44ad2
@ -0,0 +1,27 @@
|
|||||||
|
package eu.jonahbauer.raytracing.render.renderer.pdf;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Vec3;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.random.RandomGenerator;
|
||||||
|
|
||||||
|
public record CosineProbabilityDensityFunction(@NotNull Vec3 normal) implements ProbabilityDensityFunction {
|
||||||
|
|
||||||
|
public CosineProbabilityDensityFunction {
|
||||||
|
Objects.requireNonNull(normal, "normal");
|
||||||
|
normal = normal.unit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double value(@NotNull Vec3 direction) {
|
||||||
|
var cos = normal.times(direction.unit());
|
||||||
|
return Math.max(0, cos / Math.PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Vec3 generate(@NotNull RandomGenerator random) {
|
||||||
|
var out = normal().plus(Vec3.random(random, true));
|
||||||
|
return out.isNearZero() ? normal() : out;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package eu.jonahbauer.raytracing.render.renderer.pdf;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Vec3;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.random.RandomGenerator;
|
||||||
|
|
||||||
|
public record MixtureProbabilityDensityFunction(
|
||||||
|
@NotNull ProbabilityDensityFunction a,
|
||||||
|
@NotNull ProbabilityDensityFunction b,
|
||||||
|
double weight
|
||||||
|
) implements ProbabilityDensityFunction {
|
||||||
|
public MixtureProbabilityDensityFunction(@NotNull ProbabilityDensityFunction a, @NotNull ProbabilityDensityFunction b) {
|
||||||
|
this(a, b, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MixtureProbabilityDensityFunction {
|
||||||
|
Objects.requireNonNull(a);
|
||||||
|
Objects.requireNonNull(b);
|
||||||
|
weight = Math.clamp(weight, 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double value(@NotNull Vec3 direction) {
|
||||||
|
return weight * a.value(direction) + (1 - weight) * b.value(direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Vec3 generate(@NotNull RandomGenerator random) {
|
||||||
|
if (random.nextDouble() < weight) {
|
||||||
|
return a.generate(random);
|
||||||
|
} else {
|
||||||
|
return b.generate(random);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package eu.jonahbauer.raytracing.render.renderer.pdf;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Vec3;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.random.RandomGenerator;
|
||||||
|
|
||||||
|
public interface ProbabilityDensityFunction {
|
||||||
|
double value(@NotNull Vec3 direction);
|
||||||
|
@NotNull Vec3 generate(@NotNull RandomGenerator random);
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package eu.jonahbauer.raytracing.render.renderer.pdf;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Vec3;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.random.RandomGenerator;
|
||||||
|
|
||||||
|
public record SphereProbabilityDensityFunction() implements ProbabilityDensityFunction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double value(@NotNull Vec3 direction) {
|
||||||
|
return 1 / (4 * Math.PI);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Vec3 generate(@NotNull RandomGenerator random) {
|
||||||
|
return Vec3.random(random, true);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue