Rendering something parsed from a pbrt file

This commit is contained in:
hal8174 2025-08-20 23:20:41 +02:00
parent c8ff77a0a9
commit 6d363aecd0
Signed by: hal8174
SSH key fingerprint: SHA256:NN98ZYwnrreQLSOV/g+amY7C3yL/mS1heD7bi5t6PPw
7 changed files with 316 additions and 127 deletions

View file

@ -8,6 +8,7 @@ tev_client = "0.5.2"
ray-tracing-core = { path = "../ray-tracing-core" }
ray-tracing-scene = { path = "../ray-tracing-scene" }
ray-tracing-renderer = { path = "../ray-tracing-renderer" }
ray-tracing-pbrt-scene = { path = "../ray-tracing-pbrt-scene" }
rayon = "1.10.0"
rand = { version = "0.8.5", features = ["small_rng"] }
clap = { version = "4.5.19", features = ["derive"] }

View file

@ -7,6 +7,7 @@ use ray_tracing_core::{
renderer::ClassicalRenderer,
scene::Scene,
};
use ray_tracing_pbrt_scene::parse_pbrt_v4;
use ray_tracing_renderer::{
depth_renderer::DepthRenderer, mis::MIS, next_event_estimation::NextEventEstimation,
path_tracer::PathTracer, path_tracer_importance::PathTracerImportance,
@ -30,6 +31,8 @@ struct Args {
height: u32,
#[arg(long, default_value_t = 1024)]
samples_per_pixel: usize,
#[arg(long)]
pbrt_filename: Option<std::path::PathBuf>,
}
fn render_image<
@ -105,17 +108,91 @@ fn render_image<
Ok(())
}
fn choose_renderer<S, C>(args: &Args, scene: &str, s: &S, c: &C, tev: &mut TevClient)
where
S: Scene<SmallRng> + Sync,
C: Camera<SmallRng> + Sync,
{
if args.renderers.is_empty() || args.renderers.contains(&String::from("depth")) {
let r = DepthRenderer::new(args.width, args.height);
render_image(
format!("{scene} - depth renderer"),
&r,
s,
c,
args.samples_per_pixel,
tev,
)
.unwrap();
}
if args.renderers.is_empty() || args.renderers.contains(&String::from("path")) {
let r = PathTracer::new(args.width, args.height);
render_image(
format!("{scene} - path tracer"),
&r,
s,
c,
args.samples_per_pixel,
tev,
)
.unwrap();
}
if args.renderers.is_empty() || args.renderers.contains(&String::from("importance")) {
let r = PathTracerImportance::new(args.width, args.height);
render_image(
format!("{scene} - path tracer importance"),
&r,
s,
c,
args.samples_per_pixel,
tev,
)
.unwrap();
}
if args.renderers.is_empty() || args.renderers.contains(&String::from("nee")) {
let r = NextEventEstimation::new(args.width, args.height);
render_image(
format!("{scene} - next event estimation"),
&r,
s,
c,
args.samples_per_pixel,
tev,
)
.unwrap();
}
if args.renderers.is_empty() || args.renderers.contains(&String::from("mis")) {
let r = MIS::new(args.width, args.height);
render_image(
format!("{scene} - mis"),
&r,
s,
c,
args.samples_per_pixel,
tev,
)
.unwrap();
}
}
fn main() {
let args = Args::parse();
let mut client = TevClient::wrap(TcpStream::connect(args.tev).unwrap());
let mut client = TevClient::wrap(TcpStream::connect(&args.tev).unwrap());
let map = example_scenes();
let scenes: Vec<&str> = if args.scenes.is_empty() {
map.keys().copied().collect()
let scenes: Vec<&str> = if args.pbrt_filename.is_none() {
if args.scenes.is_empty() {
map.keys().copied().collect()
} else {
args.scenes.iter().map(|s| s.as_str()).collect()
}
} else {
args.scenes.iter().map(|s| s.as_str()).collect()
Vec::new()
};
for scene in scenes {
@ -132,69 +209,29 @@ fn main() {
f.get_horizontal_fov(),
);
if args.renderers.is_empty() || args.renderers.contains(&String::from("depth")) {
let r = DepthRenderer::new(args.width, args.height);
render_image(
format!("{scene} - depth renderer"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
choose_renderer(&args, scene, &s, &c, &mut client);
}
if args.renderers.is_empty() || args.renderers.contains(&String::from("path")) {
let r = PathTracer::new(args.width, args.height);
render_image(
format!("{scene} - path tracer"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
if let Some(pbrt_filename) = &args.pbrt_filename {
let pbrt = parse_pbrt_v4(pbrt_filename).unwrap();
if args.renderers.is_empty() || args.renderers.contains(&String::from("importance")) {
let r = PathTracerImportance::new(args.width, args.height);
render_image(
format!("{scene} - path tracer importance"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
let c = BasicCamera::from_look_at(
args.width,
args.height,
Pos3::new(3.0, 4.0, 1.5),
Pos3::new(0.5, 0.5, 0.0),
Dir3::new(0.0, 0.0, 1.0),
Float::to_radians(45.0),
);
if args.renderers.is_empty() || args.renderers.contains(&String::from("nee")) {
let r = NextEventEstimation::new(args.width, args.height);
render_image(
format!("{scene} - next event estimation"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
let s = &pbrt.scene;
if args.renderers.is_empty() || args.renderers.contains(&String::from("mis")) {
let r = MIS::new(args.width, args.height);
render_image(
format!("{scene} - mis"),
&r,
&s,
&c,
args.samples_per_pixel,
&mut client,
)
.unwrap();
}
choose_renderer(
&args,
&format!("pbrt \"{pbrt_filename:?}\""),
s,
&c,
&mut client,
);
}
}