diff --git a/src/lib.rs b/src/lib.rs index ea3257e..3ac3523 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -124,6 +124,7 @@ pub struct State { camera_controller: CameraController, instances: Vec, instance_buffer: wgpu::Buffer, + depth_texture: Texture, } impl State { @@ -349,6 +350,9 @@ impl State { push_constant_ranges: &[], }); + let depth_texture = + texture::Texture::create_depth_texture(&device, &config, "depth_texture"); + let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { label: Some("Render Pipeline"), layout: Some(&render_pipeline_layout), @@ -380,7 +384,13 @@ impl State { // Requires Features::CONSERVATIVE_RASTERIZATION conservative: false, }, - depth_stencil: None, // 1. + depth_stencil: Some(wgpu::DepthStencilState { + format: texture::Texture::DEPTH_FORMAT, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::Less, // 1. + stencil: wgpu::StencilState::default(), // 2. + bias: wgpu::DepthBiasState::default(), + }), multisample: wgpu::MultisampleState { count: 1, // 2. mask: !0, // 3. @@ -409,6 +419,7 @@ impl State { camera_controller, instances, instance_buffer, + depth_texture, } } @@ -422,6 +433,8 @@ impl State { self.config.width = new_size.width; self.config.height = new_size.height; self.surface.configure(&self.device, &self.config); + self.depth_texture = + texture::Texture::create_depth_texture(&self.device, &self.config, "depth_texture"); } } @@ -468,7 +481,14 @@ impl State { store: wgpu::StoreOp::Store, }, })], - depth_stencil_attachment: None, + depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment { + view: &self.depth_texture.view, + depth_ops: Some(wgpu::Operations { + load: wgpu::LoadOp::Clear(1.0), + store: wgpu::StoreOp::Store, + }), + stencil_ops: None, + }), occlusion_query_set: None, timestamp_writes: None, }); diff --git a/src/texture.rs b/src/texture.rs index f3d869c..1961590 100644 --- a/src/texture.rs +++ b/src/texture.rs @@ -76,4 +76,52 @@ impl Texture { sampler, }) } + + pub const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float; // 1. + + pub fn create_depth_texture( + device: &wgpu::Device, + config: &wgpu::SurfaceConfiguration, + label: &str, + ) -> Self { + let size = wgpu::Extent3d { + // 2. + width: config.width, + height: config.height, + depth_or_array_layers: 1, + }; + let desc = wgpu::TextureDescriptor { + label: Some(label), + size, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: Self::DEPTH_FORMAT, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT // 3. + | wgpu::TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }; + let texture = device.create_texture(&desc); + + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + // 4. + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Nearest, + compare: Some(wgpu::CompareFunction::LessEqual), // 5. + lod_min_clamp: 0.0, + lod_max_clamp: 100.0, + ..Default::default() + }); + + Self { + texture, + view, + sampler, + } + } }