Don’t load envmap

It starts much faster now!
This commit is contained in:
numzero 2025-03-29 00:04:13 +03:00
parent b637590308
commit c93ab42458
5 changed files with 8 additions and 63 deletions

View File

@ -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;

View File

@ -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...");

View File

@ -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,

View File

@ -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 }
}
}

View File

@ -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 {