Depth + basic sample-to-coverage

This commit is contained in:
numzero 2024-11-17 19:05:27 +03:00
parent 03e91fac28
commit f00f5f2f77
3 changed files with 60 additions and 18 deletions

View File

@ -215,22 +215,41 @@ impl<'a> State<'a> {
let cam_loc = camctl::CameraLocation::new(); let cam_loc = camctl::CameraLocation::new();
let t1 = Instant::now(); let t1 = Instant::now();
let depth = None;
let msaa = wgpu::MultisampleState {
count: viewport.sample_count(),
mask: !0,
alpha_to_coverage_enabled: false,
};
let cam_obj = camera::Camera::new(&device); let cam_obj = camera::Camera::new(&device);
let line_rend = lines::LineRenderer::new( let line_rend = lines::LineRenderer::new(
&device, &device,
cam_obj.bind_group_layout(), cam_obj.bind_group_layout(),
viewport.format(), viewport.format(),
depth.clone(), Some(wgpu::DepthStencilState {
msaa, format: wgpu::TextureFormat::Depth24Plus,
depth_write_enabled: false,
depth_compare: wgpu::CompareFunction::LessEqual,
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
wgpu::MultisampleState {
count: viewport.sample_count(),
mask: !0,
alpha_to_coverage_enabled: false,
},
);
let mesh_rend = meshes::Renderer::new(
&device,
cam_obj.bind_group_layout(),
viewport.format(),
Some(wgpu::DepthStencilState {
format: wgpu::TextureFormat::Depth24Plus,
depth_write_enabled: true,
depth_compare: wgpu::CompareFunction::LessEqual,
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
wgpu::MultisampleState {
count: viewport.sample_count(),
mask: !0,
alpha_to_coverage_enabled: true,
},
); );
let mesh_rend = meshes::Renderer::new(&device, cam_obj.bind_group_layout(), viewport.format(), depth, msaa);
let (meshes, lines) = prepare_scene(&device); let (meshes, lines) = prepare_scene(&device);

View File

@ -99,7 +99,7 @@ pub fn build() -> (Vec<FancyMesh>, Vec<FancyLine>) {
let mut gc = vec![]; let mut gc = vec![];
gc.push(FancyMesh { gc.push(FancyMesh {
color: vec4(0.3, 0.5, 1.0, 1.0) * 0.2, color: vec4(0.10, 0.12, 0.15, 0.8),
tris: tube.render(), tris: tube.render(),
}); });
let meshes = gc; let meshes = gc;

View File

@ -75,7 +75,7 @@ impl<'a> Viewport<'a> {
let render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { let render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("RenderPass"), label: Some("RenderPass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment { color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: &self.multisample.view, view: &self.multisample.color,
resolve_target: Some(&view), resolve_target: Some(&view),
ops: wgpu::Operations { ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(wgpu::Color { load: wgpu::LoadOp::Clear(wgpu::Color {
@ -87,7 +87,14 @@ impl<'a> Viewport<'a> {
store: wgpu::StoreOp::Store, store: wgpu::StoreOp::Store,
}, },
})], })],
depth_stencil_attachment: None, depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment {
view: &self.multisample.depth,
depth_ops: Some(wgpu::Operations {
load: wgpu::LoadOp::Clear(1.),
store: wgpu::StoreOp::Discard,
}),
stencil_ops: None,
}),
occlusion_query_set: None, occlusion_query_set: None,
timestamp_writes: None, timestamp_writes: None,
}); });
@ -99,13 +106,14 @@ impl<'a> Viewport<'a> {
} }
struct Multisample { struct Multisample {
view: wgpu::TextureView, color: wgpu::TextureView,
depth: wgpu::TextureView,
} }
impl Multisample { impl Multisample {
fn new(device: &wgpu::Device, format: wgpu::TextureFormat, size: UVec2, sample_count: u32) -> Multisample { fn new(device: &wgpu::Device, format: wgpu::TextureFormat, size: UVec2, sample_count: u32) -> Multisample {
let tex = device.create_texture(&wgpu::TextureDescriptor { let color = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Multisample texture"), label: Some("Multisample color texture"),
size: wgpu::Extent3d { size: wgpu::Extent3d {
width: size.x, width: size.x,
height: size.y, height: size.y,
@ -118,7 +126,22 @@ impl Multisample {
usage: wgpu::TextureUsages::RENDER_ATTACHMENT, usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
view_formats: &[], view_formats: &[],
}); });
let view = tex.create_view(&wgpu::TextureViewDescriptor::default()); let color = color.create_view(&wgpu::TextureViewDescriptor::default());
Multisample { view } let depth = device.create_texture(&wgpu::TextureDescriptor {
label: Some("Multisample depth texture"),
size: wgpu::Extent3d {
width: size.x,
height: size.y,
depth_or_array_layers: 1,
},
mip_level_count: 1,
sample_count,
dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::Depth24Plus,
usage: wgpu::TextureUsages::RENDER_ATTACHMENT,
view_formats: &[],
});
let depth = depth.create_view(&wgpu::TextureViewDescriptor::default());
Multisample { color, depth }
} }
} }