Rendering something parsed from a pbrt file
This commit is contained in:
parent
c8ff77a0a9
commit
6d363aecd0
7 changed files with 316 additions and 127 deletions
|
|
@ -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"] }
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue