Disable fog on wasm

This commit is contained in:
Lauri Räsänen 2023-11-10 21:26:38 +02:00
parent fed16287c5
commit 857e32d994

View file

@ -34,6 +34,7 @@ pub struct State {
queue: wgpu::Queue,
config: wgpu::SurfaceConfiguration,
geometry_pass: RenderPass,
#[cfg(not(target_arch = "wasm32"))]
fog_pass: RenderPass,
camera: Camera,
camera_uniform: CameraUniform,
@ -42,10 +43,13 @@ pub struct State {
camera_controller: CameraController,
geom_instances: Vec<Instance>,
geom_instance_buffer: wgpu::Buffer,
#[cfg(not(target_arch = "wasm32"))]
fog_instances: Vec<Instance>,
#[cfg(not(target_arch = "wasm32"))]
fog_instance_buffer: wgpu::Buffer,
geometry_depth_texture: Texture,
geom_model: Model,
#[cfg(not(target_arch = "wasm32"))]
fog_model: Model,
light_model: Model,
light_uniform: LightUniform,
@ -368,6 +372,7 @@ impl State {
.await
.unwrap();
#[cfg(not(target_arch = "wasm32"))]
let fog_model = resources::load_model_gltf(
"models/Cube.glb",
&device,
@ -399,12 +404,15 @@ impl State {
usage: wgpu::BufferUsages::VERTEX,
});
#[cfg(not(target_arch = "wasm32"))]
let fog_instances = vec![Instance {
position: [0.0, 30.0, 0.0].into(),
rotation: cgmath::Quaternion::one(),
scale: [1360.0, 30.0, 600.0].into(),
}];
#[cfg(not(target_arch = "wasm32"))]
let fog_instance_data = fog_instances.iter().map(Instance::to_raw).collect::<Vec<_>>();
#[cfg(not(target_arch = "wasm32"))]
let fog_instance_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Fog Instance Buffer"),
contents: bytemuck::cast_slice(&fog_instance_data),
@ -462,6 +470,7 @@ impl State {
Some(wgpu::Face::Back),
);
#[cfg(not(target_arch = "wasm32"))]
let fog_pass = RenderPass::new(
&device,
&[
@ -488,6 +497,7 @@ impl State {
queue,
config,
geometry_pass,
#[cfg(not(target_arch = "wasm32"))]
fog_pass,
camera,
camera_uniform,
@ -496,10 +506,13 @@ impl State {
camera_controller,
geom_instances,
geom_instance_buffer,
#[cfg(not(target_arch = "wasm32"))]
fog_instances,
#[cfg(not(target_arch = "wasm32"))]
fog_instance_buffer,
geometry_depth_texture,
geom_model,
#[cfg(not(target_arch = "wasm32"))]
fog_model,
light_model,
light_uniform,
@ -734,45 +747,48 @@ impl State {
self.queue.submit(std::iter::once(geometry_encoder.finish()));
let mut fog_encoder = self
.device
.create_command_encoder(&wgpu::CommandEncoderDescriptor {
label: Some("Fog Encoder"),
});
fog_encoder.push_debug_group("fog pass");
#[cfg(not(target_arch = "wasm32"))]
{
let mut fog_render_pass = fog_encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("Fog Render Pass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: &surface_view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Load,
store: wgpu::StoreOp::Store,
},
})],
depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
view: &self.geometry_depth_texture.view,
depth_ops: None,
stencil_ops: None,
}),
timestamp_writes: None,
occlusion_query_set: None,
});
let mut fog_encoder = self
.device
.create_command_encoder(&wgpu::CommandEncoderDescriptor {
label: Some("Fog Encoder"),
});
fog_render_pass.set_vertex_buffer(1, self.fog_instance_buffer.slice(..));
fog_render_pass.set_pipeline(&self.fog_pass.pipeline);
fog_render_pass.draw_model_instanced(
&self.fog_model,
0..self.fog_instances.len() as u32,
[&self.global_bind_group, &self.light_depth_bind_group, &self.geometry_depth_bind_group].into(),
false,
);
fog_encoder.push_debug_group("fog pass");
{
let mut fog_render_pass = fog_encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("Fog Render Pass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: &surface_view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Load,
store: wgpu::StoreOp::Store,
},
})],
depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
view: &self.geometry_depth_texture.view,
depth_ops: None,
stencil_ops: None,
}),
timestamp_writes: None,
occlusion_query_set: None,
});
fog_render_pass.set_vertex_buffer(1, self.fog_instance_buffer.slice(..));
fog_render_pass.set_pipeline(&self.fog_pass.pipeline);
fog_render_pass.draw_model_instanced(
&self.fog_model,
0..self.fog_instances.len() as u32,
[&self.global_bind_group, &self.light_depth_bind_group, &self.geometry_depth_bind_group].into(),
false,
);
}
fog_encoder.pop_debug_group();
self.queue.submit(std::iter::once(fog_encoder.finish()));
}
fog_encoder.pop_debug_group();
self.queue.submit(std::iter::once(fog_encoder.finish()));
surface_texture.present();