Skip to main content

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            multiview_mask: None,
36        };
37
38        {
39            #[cfg(feature = "profiling")]
40            let mut rpass = encoder.scoped_render_pass("OIT Resolve Pass", rpass_desc);
41            #[cfg(not(feature = "profiling"))]
42            let mut rpass = encoder.begin_render_pass(&rpass_desc);
43
44            rpass.set_pipeline(
45                &ctx.pipelines
46                    .get_or_init::<OITResolvePipeline>(ctx.wgpu_ctx),
47            );
48            rpass.set_bind_group(0, &ctx.resolution_info.bind_group, &[]);
49            rpass.set_bind_group(1, &ctx.render_textures.depth_bind_group, &[]);
50            rpass.draw(0..3, 0..1);
51        }
52        // Clear OIT pixel count buffer
53        encoder.clear_buffer(&ctx.resolution_info.pixel_count_buffer.buffer, 0, None);
54    }
55}