From c2c3e4fd468023f1726718b915594f7fd3635b22 Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Tue, 14 Jun 2022 13:24:33 +0200 Subject: [PATCH] [DEPTH] From tutorial --- engine_core/src/state.rs | 24 +++++++++++++++++++++--- engine_core/src/texture.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/engine_core/src/state.rs b/engine_core/src/state.rs index a7c53ca..c378b35 100644 --- a/engine_core/src/state.rs +++ b/engine_core/src/state.rs @@ -62,6 +62,7 @@ pub struct State { diffuse_bind_group: wgpu::BindGroup, #[allow(dead_code)] diffuse_texture: super::texture::Texture, + depth_texture: super::texture::Texture, toggle: bool } @@ -316,6 +317,8 @@ impl State { usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST, }); + let depth_texture = super::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), @@ -345,7 +348,13 @@ impl State { // Requires Features::CONSERVATIVE_RASTERIZATION conservative: false, }, - depth_stencil: None, + depth_stencil: Some(wgpu::DepthStencilState { + format: super::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, mask: !0, @@ -376,7 +385,8 @@ impl State { diffuse_texture_pikachu, instances, instance_buffer, - toggle: false + toggle: false, + depth_texture, } } @@ -387,6 +397,7 @@ impl State { self.config.height = new_size.height; self.surface.configure(&self.device, &self.config); } + self.depth_texture = super::texture::Texture::create_depth_texture(&self.device, &self.config, "depth_texture"); } pub fn input(&mut self, event: &WindowEvent) -> bool { @@ -469,7 +480,14 @@ impl State { }, }, ], - 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: true, + }), + stencil_ops: None, + }) }); render_pass.set_pipeline(&self.render_pipeline); diff --git a/engine_core/src/texture.rs b/engine_core/src/texture.rs index 076a297..a6f9165 100644 --- a/engine_core/src/texture.rs +++ b/engine_core/src/texture.rs @@ -8,6 +8,7 @@ pub struct Texture { } impl Texture { + pub const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float; pub fn from_bytes( device: &wgpu::Device, queue: &wgpu::Queue, @@ -75,4 +76,41 @@ impl Texture { sampler, }) } + + pub fn create_depth_texture(device: &wgpu::Device, config: &wgpu::SurfaceConfiguration, label: &str) -> Self { + let size = wgpu::Extent3d { + 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 + | wgpu::TextureUsages::TEXTURE_BINDING, + }; + let texture = device.create_texture(&desc); + + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); + let sampler = device.create_sampler( + &wgpu::SamplerDescriptor { + 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), + lod_min_clamp: -100.0, + lod_max_clamp: 100.0, + ..Default::default() + } + ); + + Self { texture, view, sampler } + } }