ranim_render/graph/
oit_resolve.rs1use crate::{
2 RenderContext, RenderTextures,
3 graph::{GlobalRenderNodeTrait, RenderPacketsQuery},
4 pipelines::OITResolvePipeline,
5};
6
7pub struct OITResolveNode;
8
9impl GlobalRenderNodeTrait for OITResolveNode {
10 type Query = ();
11 fn run(
12 &self,
13 #[cfg(not(feature = "profiling"))] encoder: &mut wgpu::CommandEncoder,
14 #[cfg(feature = "profiling")] encoder: &mut wgpu_profiler::Scope<'_, wgpu::CommandEncoder>,
15 _packets: <Self::Query as RenderPacketsQuery>::Output<'_>,
16 ctx: RenderContext,
17 ) {
18 let RenderTextures { render_view, .. } = ctx.render_textures;
19
20 let rpass_desc = wgpu::RenderPassDescriptor {
22 label: Some("OIT Resolve Pass"),
23 color_attachments: &[Some(wgpu::RenderPassColorAttachment {
24 view: render_view,
25 resolve_target: None,
26 depth_slice: None,
27 ops: wgpu::Operations {
28 load: wgpu::LoadOp::Load,
29 store: wgpu::StoreOp::Store,
30 },
31 })],
32 depth_stencil_attachment: None, timestamp_writes: None,
34 occlusion_query_set: None,
35 };
36
37 {
38 #[cfg(feature = "profiling")]
39 let mut rpass = encoder.scoped_render_pass("OIT Resolve Pass", rpass_desc);
40 #[cfg(not(feature = "profiling"))]
41 let mut rpass = encoder.begin_render_pass(&rpass_desc);
42
43 rpass.set_pipeline(
44 &ctx.pipelines
45 .get_or_init::<OITResolvePipeline>(ctx.wgpu_ctx),
46 );
47 rpass.set_bind_group(0, &ctx.resolution_info.bind_group, &[]);
48 rpass.set_bind_group(1, &ctx.render_textures.depth_bind_group, &[]);
49 rpass.draw(0..3, 0..1);
50 }
51 encoder.clear_buffer(&ctx.resolution_info.pixel_count_buffer.buffer, 0, None);
53 }
54}