added emitting material and 2nd example render
All checks were successful
Build & Test / build (push) Successful in 38s

This commit is contained in:
2026-02-18 22:26:06 +01:00
parent 44f8803f41
commit d8a3d4c989
5 changed files with 52 additions and 11 deletions

View File

@@ -2,3 +2,4 @@
![Build](https://git.veltko.de/plexx-dev/raychel-rs/actions/workflows/build.yml/badge.svg?branch=main&event=push&style=flat-square) ![Build](https://git.veltko.de/plexx-dev/raychel-rs/actions/workflows/build.yml/badge.svg?branch=main&event=push&style=flat-square)
### quick and dirty multithreaded raymarcher using the awesome [_Ray Tracing in One Weekend_](https://raytracing.github.io/books/RayTracingInOneWeekend.html) Book Series ### quick and dirty multithreaded raymarcher using the awesome [_Ray Tracing in One Weekend_](https://raytracing.github.io/books/RayTracingInOneWeekend.html) Book Series
![Example Scene](example.png) ![Example Scene](example.png)
![Example Dark Scene](example_dark.png)

BIN
example_dark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

View File

@@ -73,21 +73,24 @@ impl Camera {
} }
if let Some(rec) = world.hit(&r, 0.001, f64::INFINITY) { if let Some(rec) = world.hit(&r, 0.001, f64::INFINITY) {
let emitted = rec.material.emitted();
let mut scattered = Ray::new_empty(); let mut scattered = Ray::new_empty();
let mut attenuation = Color::new_empty(); let mut attenuation = Color::new_empty();
if rec if rec
.material .material
.scatter(r, rec, &mut attenuation, &mut scattered) .scatter(r, rec.clone(), &mut attenuation, &mut scattered)
{ {
return attenuation * Self::ray_color(&self, scattered, world, depth - 1); return emitted + attenuation * self.ray_color(scattered, world, depth - 1);
} else {
return emitted;
} }
return Color::new_empty();
} }
let unit_direction: Vec3 = r.direction().unit_vector(); // Sky background
let t = 0.5 * (unit_direction.y() + 1.0); // let unit_direction: Vec3 = r.direction().unit_vector();
// let t = 0.5 * (unit_direction.y() + 1.0);
((1.0 - t) * Color::new(1.0, 1.0, 1.0)) + (t * Color::new(0.5, 0.7, 1.0)) //((1.0 - t) * Color::new(1.0, 1.0, 1.0)) + (t * Color::new(0.5, 0.7, 1.0))
Color::new_empty()
} }
} }

View File

@@ -10,7 +10,7 @@ pub mod vec3;
use std::{f64, thread::available_parallelism}; use std::{f64, thread::available_parallelism};
use image::{Pixel, RgbImage}; use image::RgbImage;
use indicatif::{ProgressBar, ProgressStyle}; use indicatif::{ProgressBar, ProgressStyle};
use rayon::prelude::*; use rayon::prelude::*;
@@ -74,6 +74,13 @@ fn random_scene(aspect_ratio: f64) -> (Camera, HittableList) {
} }
} }
let material0 = Light::new(Color::new(15., 15., 15.));
world.add(Box::new(Sphere::new(
Point3::new(-1.0, 1.0, 0.0),
1.0,
Box::new(material0),
)));
let material1: Dielectric = Dielectric::new(1.5); let material1: Dielectric = Dielectric::new(1.5);
world.add(Box::new(Sphere::new( world.add(Box::new(Sphere::new(
Point3::new(0.0, 1.0, 0.0), Point3::new(0.0, 1.0, 0.0),
@@ -179,10 +186,10 @@ fn three_balls_scene(aspect_ratio: f64) -> (Camera, HittableList) {
fn main() { fn main() {
// Image // Image
let aspect_ratio: f64 = 16. / 9.; let aspect_ratio: f64 = 16. / 9.;
let image_width: i32 = 500; let image_width: i32 = 1920;
let image_height: i32 = (image_width as f64 / aspect_ratio as f64) as i32; let image_height: i32 = (image_width as f64 / aspect_ratio as f64) as i32;
let samples_per_pixel: i32 = 50; let samples_per_pixel: i32 = 400;
let max_depth: i32 = 4; let max_depth: i32 = 10;
let (cam, world) = random_scene(aspect_ratio); let (cam, world) = random_scene(aspect_ratio);

View File

@@ -16,6 +16,10 @@ use crate::vec3::{random_unit_vector, reflect, refract, Color};
*/ */
pub trait Material: Send + Sync { pub trait Material: Send + Sync {
fn emitted(&self) -> Color {
Color::new(0.0, 0.0, 0.0)
}
fn scatter( fn scatter(
&self, &self,
r_in: Ray, r_in: Ray,
@@ -134,3 +138,29 @@ impl Material for Dielectric {
true true
} }
} }
pub struct Light {
emit: Color
}
impl Light {
pub const fn new(emit: Color) -> Self {
Light { emit }
}
}
impl Material for Light {
fn scatter(
&self,
_r_in: Ray,
_rec: HitRecord,
_attenuation: &mut Color,
_scattered: &mut Ray,
) -> bool {
false // Light sources dont scatter rays
}
fn emitted(&self) -> Color {
self.emit
}
}