Don’t load envmap
It starts much faster now!
This commit is contained in:
parent
b637590308
commit
c93ab42458
|
|
@ -2,7 +2,7 @@ use std::error::Error;
|
||||||
|
|
||||||
use glam::uvec2;
|
use glam::uvec2;
|
||||||
use raytracing3::present::{self, Presenter};
|
use raytracing3::present::{self, Presenter};
|
||||||
use raytracing3::scene::{load_envmap, Renderer, SceneParams};
|
use raytracing3::scene::{Renderer, SceneParams};
|
||||||
use winit::{
|
use winit::{
|
||||||
event::{Event, WindowEvent},
|
event::{Event, WindowEvent},
|
||||||
event_loop::EventLoop,
|
event_loop::EventLoop,
|
||||||
|
|
@ -21,13 +21,12 @@ fn main() {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let (device, queue, surface) = pollster::block_on(init_gpu(window)).unwrap();
|
let (device, queue, surface) = pollster::block_on(init_gpu(window)).unwrap();
|
||||||
let envmap = load_envmap(&device, &queue);
|
|
||||||
queue.submit([]);
|
queue.submit([]);
|
||||||
|
|
||||||
let output_format = wgpu::TextureFormat::Bgra8UnormSrgb;
|
let output_format = wgpu::TextureFormat::Bgra8UnormSrgb;
|
||||||
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
||||||
let scene = SceneParams::new(N_SPHERES);
|
let scene = SceneParams::new(N_SPHERES);
|
||||||
let renderer = Renderer::new(&device, envmap);
|
let renderer = Renderer::new(&device);
|
||||||
let presenter = Presenter::new(&device, output_format);
|
let presenter = Presenter::new(&device, output_format);
|
||||||
|
|
||||||
let mut frame = 0;
|
let mut frame = 0;
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use std::{fs, io};
|
||||||
use glam::{uvec2, UVec2};
|
use glam::{uvec2, UVec2};
|
||||||
use image::buffer::ConvertBuffer;
|
use image::buffer::ConvertBuffer;
|
||||||
use raytracing3::present::{self, Presenter};
|
use raytracing3::present::{self, Presenter};
|
||||||
use raytracing3::scene::{load_envmap, Renderer, SceneParams};
|
use raytracing3::scene::{Renderer, SceneParams};
|
||||||
|
|
||||||
const SIZE: UVec2 = uvec2(1920, 1080);
|
const SIZE: UVec2 = uvec2(1920, 1080);
|
||||||
const FRAME_RATE: u32 = 60;
|
const FRAME_RATE: u32 = 60;
|
||||||
|
|
@ -82,7 +82,6 @@ fn do_work(img_sender: async_channel::Sender<Frame>, start_frame: u32, stop_fram
|
||||||
let img_sender = Arc::new(img_sender);
|
let img_sender = Arc::new(img_sender);
|
||||||
|
|
||||||
let (device, queue) = pollster::block_on(init_gpu()).unwrap();
|
let (device, queue) = pollster::block_on(init_gpu()).unwrap();
|
||||||
let envmap = load_envmap(&device, &queue);
|
|
||||||
queue.submit([]);
|
queue.submit([]);
|
||||||
|
|
||||||
let texsize = wgpu::Extent3d {
|
let texsize = wgpu::Extent3d {
|
||||||
|
|
@ -95,7 +94,7 @@ fn do_work(img_sender: async_channel::Sender<Frame>, start_frame: u32, stop_fram
|
||||||
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
||||||
|
|
||||||
let scene = SceneParams::new(N_SPHERES);
|
let scene = SceneParams::new(N_SPHERES);
|
||||||
let renderer = Renderer::new(&device, envmap);
|
let renderer = Renderer::new(&device);
|
||||||
let presenter = Presenter::new(&device, output_format);
|
let presenter = Presenter::new(&device, output_format);
|
||||||
|
|
||||||
println!("Rendering...");
|
println!("Rendering...");
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::anim::{self, SphereParams};
|
use crate::anim::{self, SphereParams};
|
||||||
use crate::trace::{self, Tracer, TracerData, TracerEnv};
|
use crate::trace::{self, Tracer, TracerData};
|
||||||
use glam::{mat3, uvec2, vec3, UVec2, Vec3};
|
use glam::{mat3, uvec2, vec3, UVec2, Vec3};
|
||||||
use image::ImageReader;
|
use image::ImageReader;
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
@ -33,15 +33,13 @@ const CAMERA_LAG: f32 = 0.03;
|
||||||
|
|
||||||
pub struct Renderer {
|
pub struct Renderer {
|
||||||
tracer: Tracer,
|
tracer: Tracer,
|
||||||
env: TracerEnv,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Renderer {
|
impl Renderer {
|
||||||
pub fn new(device: &wgpu::Device, env: wgpu::TextureView) -> Self {
|
pub fn new(device: &wgpu::Device) -> Self {
|
||||||
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
let hdr_format = wgpu::TextureFormat::Rgba16Float;
|
||||||
let tracer = Tracer::new(&device, hdr_format);
|
let tracer = Tracer::new(&device, hdr_format);
|
||||||
let env = TracerEnv::new(&device, &tracer, &env);
|
Self { tracer }
|
||||||
Self { tracer, env }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -114,7 +112,6 @@ impl Renderer {
|
||||||
self.tracer.render(
|
self.tracer.render(
|
||||||
&mut render_pass.0,
|
&mut render_pass.0,
|
||||||
&data,
|
&data,
|
||||||
&self.env,
|
|
||||||
trace::Params {
|
trace::Params {
|
||||||
max_reflections: 3,
|
max_reflections: 3,
|
||||||
min_strength: 0.1,
|
min_strength: 0.1,
|
||||||
|
|
|
||||||
50
src/trace.rs
50
src/trace.rs
|
|
@ -119,10 +119,6 @@ pub struct TracerData {
|
||||||
bindings: wgpu::BindGroup,
|
bindings: wgpu::BindGroup,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct TracerEnv {
|
|
||||||
bindings: wgpu::BindGroup,
|
|
||||||
}
|
|
||||||
|
|
||||||
static SHADER: &str = include_str!("trace.wgsl");
|
static SHADER: &str = include_str!("trace.wgsl");
|
||||||
|
|
||||||
impl Tracer {
|
impl Tracer {
|
||||||
|
|
@ -150,30 +146,9 @@ impl Tracer {
|
||||||
count: None,
|
count: None,
|
||||||
}],
|
}],
|
||||||
});
|
});
|
||||||
let envmap_bgl = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
|
||||||
label: None,
|
|
||||||
entries: &[
|
|
||||||
wgpu::BindGroupLayoutEntry {
|
|
||||||
binding: 0,
|
|
||||||
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
||||||
ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering),
|
|
||||||
count: None,
|
|
||||||
},
|
|
||||||
wgpu::BindGroupLayoutEntry {
|
|
||||||
binding: 1,
|
|
||||||
visibility: wgpu::ShaderStages::FRAGMENT,
|
|
||||||
ty: wgpu::BindingType::Texture {
|
|
||||||
sample_type: wgpu::TextureSampleType::Float { filterable: true },
|
|
||||||
view_dimension: wgpu::TextureViewDimension::Cube,
|
|
||||||
multisampled: false,
|
|
||||||
},
|
|
||||||
count: None,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
|
let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
|
||||||
label: None,
|
label: None,
|
||||||
bind_group_layouts: &[&spheres_bgl, &envmap_bgl],
|
bind_group_layouts: &[&spheres_bgl],
|
||||||
push_constant_ranges: &[wgpu::PushConstantRange {
|
push_constant_ranges: &[wgpu::PushConstantRange {
|
||||||
stages: wgpu::ShaderStages::FRAGMENT,
|
stages: wgpu::ShaderStages::FRAGMENT,
|
||||||
range: 0..mem::size_of::<ParamsData>() as u32,
|
range: 0..mem::size_of::<ParamsData>() as u32,
|
||||||
|
|
@ -258,7 +233,6 @@ impl Tracer {
|
||||||
&self,
|
&self,
|
||||||
pass: &mut wgpu::RenderPass,
|
pass: &mut wgpu::RenderPass,
|
||||||
data: &TracerData,
|
data: &TracerData,
|
||||||
env: &TracerEnv,
|
|
||||||
params: Params,
|
params: Params,
|
||||||
viewport: Viewport,
|
viewport: Viewport,
|
||||||
aperture: Aperture,
|
aperture: Aperture,
|
||||||
|
|
@ -275,7 +249,6 @@ impl Tracer {
|
||||||
);
|
);
|
||||||
pass.set_vertex_buffer(0, self.view_buf.slice(..));
|
pass.set_vertex_buffer(0, self.view_buf.slice(..));
|
||||||
pass.set_bind_group(0, &data.bindings, &[]);
|
pass.set_bind_group(0, &data.bindings, &[]);
|
||||||
pass.set_bind_group(1, &env.bindings, &[]);
|
|
||||||
pass.draw(0..4, 0..1);
|
pass.draw(0..4, 0..1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -299,24 +272,3 @@ impl TracerData {
|
||||||
Self { bindings }
|
Self { bindings }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TracerEnv {
|
|
||||||
pub fn new(device: &wgpu::Device, tracer: &Tracer, view: &wgpu::TextureView) -> Self {
|
|
||||||
let sampler = device.create_sampler(&wgpu::SamplerDescriptor::default());
|
|
||||||
let bindings = device.create_bind_group(&wgpu::BindGroupDescriptor {
|
|
||||||
label: None,
|
|
||||||
layout: &tracer.pipeline.get_bind_group_layout(1),
|
|
||||||
entries: &[
|
|
||||||
wgpu::BindGroupEntry {
|
|
||||||
binding: 0,
|
|
||||||
resource: wgpu::BindingResource::Sampler(&sampler),
|
|
||||||
},
|
|
||||||
wgpu::BindGroupEntry {
|
|
||||||
binding: 1,
|
|
||||||
resource: wgpu::BindingResource::TextureView(view),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
Self { bindings }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,6 @@ struct Varying {
|
||||||
|
|
||||||
var<push_constant> params: Params;
|
var<push_constant> params: Params;
|
||||||
@group(0) @binding(1) var<storage, read> spheres: array<Sphere>;
|
@group(0) @binding(1) var<storage, read> spheres: array<Sphere>;
|
||||||
@group(1) @binding(0) var env_sampler: sampler;
|
|
||||||
@group(1) @binding(1) var env_texture: texture_cube<f32>;
|
|
||||||
|
|
||||||
@vertex
|
@vertex
|
||||||
fn on_vertex(in: Vertex) -> Varying {
|
fn on_vertex(in: Vertex) -> Varying {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user