Fix microfacet bug and put dragon into box

This commit is contained in:
hal8174 2024-12-30 21:07:08 +01:00
parent c26285a98e
commit 9195b48079
3 changed files with 36 additions and 14 deletions

View file

@ -28,7 +28,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
// generate_chart("diffuse.png", &m, 100, w_in)?;
let m = Microfacet::new(BeckmannDistribution::new(0.1), color);
generate_chart("microfacet.png", &m, 400, w_in)?;
generate_chart("microfacet.png", &m, 100, w_in)?;
// let m = OrenNayar::new(0.5, color);
// generate_chart("oren-nayar.png", &m, 100, w_in)?;

View file

@ -30,7 +30,7 @@ pub fn fresnel_real(cos_theta_in: Float, nu1: Float, nu2: Float) -> Float {
impl<R: Rng, D: MicrofacetDistribution + Debug + Sync> Material<R> for Microfacet<D> {
fn eval(&self, w_in: Dir3, w_out: Dir3, _rng: &mut R) -> ray_tracing_core::prelude::Color {
if w_out.y() > 0.0 {
if w_out.y() > 0.0 && w_in.y() > 0.0 {
let w_h = (w_in + w_out).normalize();
let g = self.dist.g1(w_in, w_h) * self.dist.g1(w_out, w_h);

View file

@ -18,8 +18,8 @@ pub fn scene<R: Rng + Debug + 'static>() -> ExampleScene<R> {
let f = || {
let color = Color::new(0.2, 0.2, 0.9);
// let m = DiffuseMaterial::new(color);
// let m = Microfacet::new(BeckmannDistribution::new(0.5), color);
let m = OrenNayar::new(0.5, color);
let m = Microfacet::new(BeckmannDistribution::new(0.1), color);
// let m = OrenNayar::new(0.5, color);
let obj = ObjData::new("ray-tracing-scene/obj/stanford_dragon.obj").unwrap();
@ -30,27 +30,49 @@ pub fn scene<R: Rng + Debug + 'static>() -> ExampleScene<R> {
let materials = vec![
BVHMaterial::new_material(m),
BVHMaterial::new_material(OrenNayar::new(0.5, Color::new(0.8, 0.8, 0.8))),
BVHMaterial::new_material(OrenNayar::new(0.5, Color::new(0.9, 0.0, 0.0))),
BVHMaterial::new_material(OrenNayar::new(0.5, Color::new(0.0, 0.9, 0.0))),
BVHMaterial::new_light(AreaLight::new(Color::white() * 30.0)),
];
let mut vertices = obj.vertices;
for v in &mut vertices {
*v = Pos3::new(v.x(), v.z(), -v.y());
*v = Pos3::new(v.x(), v.z() + 60.0, -v.y());
}
let y_pos = 400.0;
let side_length = 400.0;
let light_size = 150.0;
let light_offset = 0.01;
let offset = vertices.len() as u32;
vertices.extend_from_slice(&[
Pos3::new(light_size, y_pos, light_size),
Pos3::new(light_size, y_pos, -light_size),
Pos3::new(-light_size, y_pos, light_size),
Pos3::new(-light_size, y_pos, -light_size),
Pos3::new(side_length, 2.0 * side_length, side_length),
Pos3::new(side_length, 2.0 * side_length, -side_length),
Pos3::new(side_length, 0.0, side_length),
Pos3::new(side_length, 0.0, -side_length),
Pos3::new(-side_length, 2.0 * side_length, side_length),
Pos3::new(-side_length, 2.0 * side_length, -side_length),
Pos3::new(-side_length, 0.0, side_length),
Pos3::new(-side_length, 0.0, -side_length),
Pos3::new(light_size, 2.0 * side_length - light_offset, light_size),
Pos3::new(light_size, 2.0 * side_length - light_offset, -light_size),
Pos3::new(-light_size, 2.0 * side_length - light_offset, light_size),
Pos3::new(-light_size, 2.0 * side_length - light_offset, -light_size),
]);
triangles.extend_from_slice(&[
Triangle::new([offset, offset + 2, offset + 1], 1),
Triangle::new([offset + 3, offset + 1, offset + 2], 1),
Triangle::new([offset, 1 + offset, 2 + offset], 1),
Triangle::new([1 + offset, 3 + offset, 2 + offset], 1),
Triangle::new([offset, 4 + offset, 1 + offset], 1),
Triangle::new([1 + offset, 4 + offset, 5 + offset], 1),
Triangle::new([2 + offset, 3 + offset, 6 + offset], 1),
Triangle::new([3 + offset, 7 + offset, 6 + offset], 1),
Triangle::new([offset, 2 + offset, 4 + offset], 2),
Triangle::new([6 + offset, 4 + offset, 2 + offset], 2),
Triangle::new([1 + offset, 5 + offset, 3 + offset], 3),
Triangle::new([7 + offset, 3 + offset, 5 + offset], 3),
Triangle::new([8 + offset, 10 + offset, 9 + offset], 4),
Triangle::new([11 + offset, 9 + offset, 10 + offset], 4),
]);
let scene = TriangleBVH::new(vertices, triangles, materials);
@ -59,8 +81,8 @@ pub fn scene<R: Rng + Debug + 'static>() -> ExampleScene<R> {
ExampleScene {
scene: f,
camera_pos: Pos3::new(-150.0, 100.0, 250.0),
camera_look_at: Pos3::new(0.0, 0.0, 0.0),
camera_pos: Pos3::new(-150.0, 160.0, 250.0),
camera_look_at: Pos3::new(0.0, 60.0, 0.0),
camera_up: Dir3::up(),
horizontal_fov: 90.0_f32.to_radians(),
}