Add interactive viewer
This commit is contained in:
parent
7d69122e8c
commit
b5eb6fbbd0
7 changed files with 2521 additions and 158 deletions
111
ray-tracing-egui/src/render.rs
Normal file
111
ray-tracing-egui/src/render.rs
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
use std::sync::{
|
||||
mpsc::{Receiver, Sender},
|
||||
Arc,
|
||||
};
|
||||
|
||||
use rand::{rngs::SmallRng, SeedableRng};
|
||||
use ray_tracing_core::{camera::BasicCamera, renderer::ClassicalRenderer};
|
||||
use ray_tracing_renderer::path_tracer_importance::PathTracerImportance;
|
||||
use ray_tracing_scene::examples::{self, example_scenes, ExampleScene};
|
||||
use rayon::{
|
||||
iter::{IndexedParallelIterator, ParallelIterator},
|
||||
slice::ParallelSliceMut,
|
||||
};
|
||||
use vulkano::{
|
||||
buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer},
|
||||
memory::allocator::{
|
||||
AllocationCreateInfo, FreeListAllocator, GenericMemoryAllocator, MemoryAllocator,
|
||||
MemoryTypeFilter,
|
||||
},
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct RenderSettings {
|
||||
pub width: u32,
|
||||
pub height: u32,
|
||||
}
|
||||
|
||||
pub enum ControlMessages {
|
||||
SetSettings(RenderSettings),
|
||||
}
|
||||
|
||||
pub struct Data {
|
||||
pub width: u32,
|
||||
pub height: u32,
|
||||
pub samples: u32,
|
||||
pub buffer: Subbuffer<[f32]>,
|
||||
}
|
||||
|
||||
pub fn render_thread(
|
||||
s: RenderSettings,
|
||||
rx: Receiver<RenderSettings>,
|
||||
tx: Sender<Data>,
|
||||
allocator: Arc<impl MemoryAllocator>,
|
||||
) {
|
||||
let mut settings = s;
|
||||
|
||||
let mut buffer = vec![0.0; settings.width as usize * settings.height as usize * 3];
|
||||
|
||||
let e = examples::basic_cornell();
|
||||
|
||||
let scene = e.scene;
|
||||
|
||||
let camera = BasicCamera::new(
|
||||
settings.width,
|
||||
settings.height,
|
||||
e.camera_pos,
|
||||
e.camera_dir,
|
||||
e.camera_up,
|
||||
e.horizontal_fov,
|
||||
);
|
||||
|
||||
let mut renderer = PathTracerImportance::new(settings.width, settings.height);
|
||||
|
||||
let mut samples = 0;
|
||||
loop {
|
||||
while let Ok(s) = rx.try_recv() {
|
||||
settings = s;
|
||||
buffer = vec![0.0; settings.width as usize * settings.height as usize * 3];
|
||||
renderer = PathTracerImportance::new(settings.width, settings.height);
|
||||
samples = 0;
|
||||
}
|
||||
|
||||
buffer.par_chunks_mut(3).enumerate().for_each(|(i, c)| {
|
||||
let x = (i % settings.width as usize) as u32;
|
||||
let y = (i / settings.height as usize) as u32;
|
||||
|
||||
let mut rng = SmallRng::seed_from_u64(
|
||||
(x + y * settings.width) as u64
|
||||
+ (settings.width as u64 * settings.height as u64 * samples as u64),
|
||||
);
|
||||
let r = renderer.render_pixel(&scene, &camera, x, y, &mut rng);
|
||||
c[0] += r.r();
|
||||
c[1] += r.g();
|
||||
c[2] += r.b();
|
||||
});
|
||||
|
||||
samples += 1;
|
||||
|
||||
let data = Data {
|
||||
width: settings.width,
|
||||
height: settings.height,
|
||||
samples,
|
||||
buffer: Buffer::from_iter(
|
||||
allocator.clone(),
|
||||
BufferCreateInfo {
|
||||
usage: BufferUsage::STORAGE_BUFFER,
|
||||
..Default::default()
|
||||
},
|
||||
AllocationCreateInfo {
|
||||
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE
|
||||
| MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
|
||||
..Default::default()
|
||||
},
|
||||
buffer.iter().copied(),
|
||||
)
|
||||
.unwrap(),
|
||||
};
|
||||
|
||||
let _ = tx.send(data);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue