ranim_render/graph/
oit_resolve.rs

1use 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        // OIT Resolve Pass: Blend the transparent layers onto the opaque background
21        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, // No depth attachment
33            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        // Clear OIT pixel count buffer
52        encoder.clear_buffer(&ctx.resolution_info.pixel_count_buffer.buffer, 0, None);
53    }
54}