Add tev output
This commit is contained in:
parent
c517a836ee
commit
0a70fbd8d4
6 changed files with 148 additions and 9 deletions
35
Cargo.lock
generated
35
Cargo.lock
generated
|
|
@ -128,9 +128,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.1.22"
|
||||
version = "1.1.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0"
|
||||
checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938"
|
||||
dependencies = [
|
||||
"jobserver",
|
||||
"libc",
|
||||
|
|
@ -544,9 +544,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.19.0"
|
||||
version = "1.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1"
|
||||
dependencies = [
|
||||
"portable-atomic",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
|
|
@ -573,6 +576,12 @@ dependencies = [
|
|||
"miniz_oxide 0.8.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "portable-atomic"
|
||||
version = "1.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
version = "0.2.20"
|
||||
|
|
@ -754,6 +763,18 @@ dependencies = [
|
|||
"ray-tracing-material",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ray-tracing-tev"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"rand",
|
||||
"ray-tracing-core",
|
||||
"ray-tracing-renderer",
|
||||
"ray-tracing-scene",
|
||||
"rayon",
|
||||
"tev_client",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.10.0"
|
||||
|
|
@ -884,6 +905,12 @@ version = "0.12.16"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
||||
|
||||
[[package]]
|
||||
name = "tev_client"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c845c2d56d4f732d09a32c9ea2cd3f01923be7a5f98d9f7f0a347205c3141036"
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.64"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
[workspace]
|
||||
|
||||
members = [ "ray-tracing-core", "ray-tracing-image", "ray-tracing-material", "ray-tracing-renderer", "ray-tracing-scene"]
|
||||
members = [ "ray-tracing-core", "ray-tracing-image", "ray-tracing-material", "ray-tracing-renderer", "ray-tracing-scene", "ray-tracing-tev"]
|
||||
resolver = "2"
|
||||
|
|
|
|||
|
|
@ -37,10 +37,10 @@ where
|
|||
let r = self.camera.forward(x, y, rng);
|
||||
|
||||
if let Some(i) = self.scene.intersect(r, 0.0, Float::INFINITY) {
|
||||
// Color::gray(1.0 / i.t())
|
||||
let c = 0.5 * (i.normal() + Dir3::new(1.0, 1.0, 1.0));
|
||||
Color::gray(1.0 / i.t())
|
||||
// let c = 0.5 * (i.normal() + Dir3::new(1.0, 1.0, 1.0));
|
||||
// let c = i.normal();
|
||||
Color::new(c.x(), c.y(), c.z())
|
||||
// Color::new(c.x(), c.y(), c.z())
|
||||
} else {
|
||||
Color::black()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ where
|
|||
let w_in = frame.to_frame(-r.dir());
|
||||
|
||||
if let Some(light) = i.light() {
|
||||
sum += alpha * light.emit(w_in, rng) * w_in.y();
|
||||
sum += alpha * light.emit(w_in, rng);
|
||||
}
|
||||
|
||||
let w_out = if let Some(material) = i.material() {
|
||||
|
|
|
|||
12
ray-tracing-tev/Cargo.toml
Normal file
12
ray-tracing-tev/Cargo.toml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[package]
|
||||
name = "ray-tracing-tev"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
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" }
|
||||
rayon = "1.10.0"
|
||||
rand = { version = "0.8.5", features = ["small_rng"] }
|
||||
100
ray-tracing-tev/src/main.rs
Normal file
100
ray-tracing-tev/src/main.rs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
use rand::{rngs::SmallRng, SeedableRng};
|
||||
use ray_tracing_core::{camera::BasicCamera, prelude::*, renderer::ClassicalRenderer};
|
||||
use ray_tracing_renderer::{
|
||||
depth_renderer::DepthRenderer, path_tracer::PathTracer,
|
||||
path_tracer_importance::PathTracerImportance,
|
||||
};
|
||||
use ray_tracing_scene::triangle_bvh::{examples::cornel, TriangleBVH};
|
||||
use rayon::prelude::*;
|
||||
use std::{net::TcpStream, path::Path};
|
||||
use tev_client::{PacketCreateImage, PacketUpdateImage, TevClient, TevError};
|
||||
|
||||
fn render_image<C: ClassicalRenderer<SmallRng> + Sync>(
|
||||
renderer: C,
|
||||
name: impl AsRef<str>,
|
||||
samples_per_pixel: usize,
|
||||
tev: &mut TevClient,
|
||||
) -> Result<(), TevError> {
|
||||
let mut data = vec![0.0; (renderer.width() * renderer.height() * 3) as usize];
|
||||
|
||||
data.par_chunks_mut(3).enumerate().for_each(|(i, c)| {
|
||||
let x = (i % renderer.width() as usize) as u32;
|
||||
let y = (i / renderer.width() as usize) as u32;
|
||||
|
||||
let mut rng = SmallRng::seed_from_u64((x + y * renderer.width()) as u64);
|
||||
for _ in 0..samples_per_pixel {
|
||||
let r = renderer.render_pixel(x, y, &mut rng) / (samples_per_pixel as Float);
|
||||
c[0] += r.r();
|
||||
c[1] += r.g();
|
||||
c[2] += r.b();
|
||||
}
|
||||
});
|
||||
|
||||
let channel_names = &["r", "g", "b"];
|
||||
|
||||
tev.send(PacketCreateImage {
|
||||
image_name: name.as_ref(),
|
||||
grab_focus: false,
|
||||
width: renderer.width(),
|
||||
height: renderer.height(),
|
||||
channel_names,
|
||||
})?;
|
||||
|
||||
tev.send(PacketUpdateImage {
|
||||
image_name: name.as_ref(),
|
||||
grab_focus: false,
|
||||
channel_names,
|
||||
channel_offsets: &[0, 1, 2],
|
||||
channel_strides: &[3, 3, 3],
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: renderer.width(),
|
||||
height: renderer.height(),
|
||||
data: &data,
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_scene() -> (TriangleBVH<SmallRng>, BasicCamera) {
|
||||
let s = cornel();
|
||||
|
||||
let c = BasicCamera::new(
|
||||
400,
|
||||
400,
|
||||
Pos3::new(-6.0, 0.0, 0.0),
|
||||
Dir3::new(1.0, 0.0, 0.0),
|
||||
Dir3::up(),
|
||||
Float::to_radians(90.0),
|
||||
);
|
||||
|
||||
(s, c)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut client = TevClient::wrap(TcpStream::connect("127.0.0.1:14158").unwrap());
|
||||
|
||||
let (s, c) = get_scene();
|
||||
let r = DepthRenderer::new(s, c);
|
||||
render_image(r, "depth renderer", 128, &mut client).unwrap();
|
||||
|
||||
let samples_per_pixel = 1024;
|
||||
|
||||
let (s, c) = get_scene();
|
||||
let r = PathTracer::new(s, c);
|
||||
render_image(r, "example path tracer", samples_per_pixel, &mut client).unwrap();
|
||||
|
||||
let (s, c) = get_scene();
|
||||
let r = PathTracerImportance::new(s, c);
|
||||
render_image(
|
||||
r,
|
||||
"example path tracer importance 1024",
|
||||
samples_per_pixel,
|
||||
&mut client,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let (s, c) = get_scene();
|
||||
let r = PathTracerImportance::new(s, c);
|
||||
render_image(r, "example path tracer importance 2048", 2048, &mut client).unwrap();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue