Skip to content

Commit bb7b5d4

Browse files
committed
updated builder API to support arbitrary attachments
improved docs
1 parent 22c2028 commit bb7b5d4

File tree

11 files changed

+246
-291
lines changed

11 files changed

+246
-291
lines changed

crates/bevy_core_pipeline/src/bloom/mod.rs

Lines changed: 24 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -239,19 +239,12 @@ impl Node for BloomNode {
239239

240240
{
241241
let view = &BloomTextures::texture_view(&textures.texture_a, 0);
242-
let mut prefilter_pass = render_context.begin_tracked_render_pass(
243-
RenderPassDescriptor {
244-
label: Some("bloom_prefilter_pass"),
245-
color_attachments: &[Some(RenderPassColorAttachment {
246-
view,
247-
resolve_target: None,
248-
ops: Operations::default(),
249-
})],
250-
depth_stencil_attachment: None,
251-
},
252-
view_entity,
253-
);
254-
prefilter_pass
242+
243+
render_context
244+
.render_pass(view_entity)
245+
.set_label("bloom_prefilter_pass")
246+
.add_color_attachment(view)
247+
.begin()
255248
.set_camera_viewport(camera)
256249
.set_render_pipeline(downsampling_prefilter_pipeline)
257250
.set_bind_group(
@@ -264,19 +257,12 @@ impl Node for BloomNode {
264257

265258
for mip in 1..textures.mip_count {
266259
let view = &BloomTextures::texture_view(&textures.texture_a, mip);
267-
let mut downsampling_pass = render_context.begin_tracked_render_pass(
268-
RenderPassDescriptor {
269-
label: Some("bloom_downsampling_pass"),
270-
color_attachments: &[Some(RenderPassColorAttachment {
271-
view,
272-
resolve_target: None,
273-
ops: Operations::default(),
274-
})],
275-
depth_stencil_attachment: None,
276-
},
277-
view_entity,
278-
);
279-
downsampling_pass
260+
261+
render_context
262+
.render_pass(view_entity)
263+
.set_label("bloom_downsampling_pass")
264+
.add_color_attachment(view)
265+
.begin()
280266
.set_camera_viewport(camera)
281267
.set_render_pipeline(downsampling_pipeline)
282268
.set_bind_group(
@@ -289,19 +275,12 @@ impl Node for BloomNode {
289275

290276
for mip in (1..textures.mip_count).rev() {
291277
let view = &BloomTextures::texture_view(&textures.texture_b, mip - 1);
292-
let mut upsampling_pass = render_context.begin_tracked_render_pass(
293-
RenderPassDescriptor {
294-
label: Some("bloom_upsampling_pass"),
295-
color_attachments: &[Some(RenderPassColorAttachment {
296-
view,
297-
resolve_target: None,
298-
ops: Operations::default(),
299-
})],
300-
depth_stencil_attachment: None,
301-
},
302-
view_entity,
303-
);
304-
upsampling_pass
278+
279+
render_context
280+
.render_pass(view_entity)
281+
.set_label("bloom_upsampling_pass")
282+
.add_color_attachment(view)
283+
.begin()
305284
.set_camera_viewport(camera)
306285
.set_render_pipeline(upsampling_pipeline)
307286
.set_bind_group(
@@ -313,20 +292,12 @@ impl Node for BloomNode {
313292
}
314293

315294
{
316-
let mut upsampling_final_pass = render_context.begin_tracked_render_pass(
317-
RenderPassDescriptor {
318-
label: Some("bloom_upsampling_final_pass"),
319-
color_attachments: &[Some(view_target.get_unsampled_color_attachment(
320-
Operations {
321-
load: LoadOp::Load,
322-
store: true,
323-
},
324-
))],
325-
depth_stencil_attachment: None,
326-
},
327-
view_entity,
328-
);
329-
upsampling_final_pass
295+
render_context
296+
.render_pass(view_entity)
297+
.set_label("bloom_upsampling_final_pass")
298+
.add_view_target_unsampled(view_target)
299+
.set_color_ops(LoadOp::Load, true)
300+
.begin()
330301
.set_camera_viewport(camera)
331302
.set_render_pipeline(upsampling_final_pipeline)
332303
.set_bind_group(

crates/bevy_core_pipeline/src/clear_color.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use bevy_derive::{Deref, DerefMut};
22
use bevy_ecs::prelude::*;
33
use bevy_reflect::{Reflect, ReflectDeserialize, ReflectSerialize};
4+
use bevy_render::render_resource::{LoadOp, RawColor};
45
use bevy_render::{color::Color, extract_resource::ExtractResource};
56
use serde::{Deserialize, Serialize};
67

@@ -13,6 +14,17 @@ pub enum ClearColorConfig {
1314
None,
1415
}
1516

17+
impl ClearColorConfig {
18+
#[inline]
19+
pub fn load_op(&self, world: &World) -> LoadOp<RawColor> {
20+
match self {
21+
ClearColorConfig::Default => LoadOp::Clear(world.resource::<ClearColor>().0.into()),
22+
ClearColorConfig::Custom(color) => LoadOp::Clear((*color).into()),
23+
ClearColorConfig::None => LoadOp::Load,
24+
}
25+
}
26+
}
27+
1628
/// A [`Resource`] that stores the color that is used to clear the screen between frames.
1729
///
1830
/// This color appears as the "background" color for simple apps,

crates/bevy_core_pipeline/src/core_2d/main_pass_2d_node.rs

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
use crate::{
2-
clear_color::{ClearColor, ClearColorConfig},
3-
core_2d::{camera_2d::Camera2d, Transparent2d},
4-
};
1+
use crate::core_2d::{camera_2d::Camera2d, Transparent2d};
52
use bevy_ecs::prelude::*;
63
use bevy_render::{
74
camera::ExtractedCamera,
85
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
96
render_phase::RenderPhase,
10-
render_resource::LoadOp,
117
renderer::RenderContext,
128
view::{ExtractedView, ViewTarget},
139
};
@@ -63,22 +59,12 @@ impl Node for MainPass2dNode {
6359
#[cfg(feature = "trace")]
6460
let _main_pass_2d = info_span!("main_pass_2d").entered();
6561

66-
let mut render_pass = target
67-
.render_pass(view_entity, None)
68-
.label("main_pass_2d")
69-
.color_ops(
70-
match camera_2d.clear_color {
71-
ClearColorConfig::Default => {
72-
LoadOp::Clear(world.resource::<ClearColor>().0.into())
73-
}
74-
ClearColorConfig::Custom(color) => LoadOp::Clear(color.into()),
75-
ClearColorConfig::None => LoadOp::Load,
76-
},
77-
true,
78-
)
79-
.begin(render_context);
80-
81-
render_pass
62+
render_context
63+
.render_pass(view_entity)
64+
.set_label("main_pass_2d")
65+
.add_view_target(target)
66+
.set_color_ops(camera_2d.clear_color.load_op(world), true)
67+
.begin()
8268
.set_camera_viewport(camera)
8369
.render_phase(transparent_phase, world);
8470
}
@@ -87,14 +73,17 @@ impl Node for MainPass2dNode {
8773
// reset for the next render pass so add an empty render pass without a custom viewport
8874
#[cfg(feature = "webgl")]
8975
if camera.viewport.is_some() {
76+
use bevy_render::render_resource::LoadOp;
77+
9078
#[cfg(feature = "trace")]
9179
let _reset_viewport_pass_2d = info_span!("reset_viewport_pass_2d").entered();
9280

93-
target
94-
.render_pass(view_entity, None)
95-
.label("reset_view_port_pass_2d")
96-
.color_ops(LoadOp::Load, true)
97-
.begin(render_context);
81+
render_context
82+
.render_pass(view_entity)
83+
.set_label("reset_view_port_pass_2d")
84+
.add_view_target(target)
85+
.set_color_ops(LoadOp::Load, true)
86+
.begin();
9887
}
9988

10089
Ok(())

crates/bevy_core_pipeline/src/core_3d/main_pass_3d_node.rs

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::{
2-
clear_color::{ClearColor, ClearColorConfig},
32
core_3d::{AlphaMask3d, Camera3d, Opaque3d, Transparent3d},
43
prepass::{DepthPrepass, NormalPrepass},
54
};
@@ -15,8 +14,6 @@ use bevy_render::{
1514
#[cfg(feature = "trace")]
1615
use bevy_utils::tracing::info_span;
1716

18-
use super::Camera3dDepthLoadOp;
19-
2017
pub struct MainPass3dNode {
2118
query: QueryState<
2219
(
@@ -82,33 +79,22 @@ impl Node for MainPass3dNode {
8279
#[cfg(feature = "trace")]
8380
let _main_opaque_pass_3d_span = info_span!("main_opaque_pass_3d").entered();
8481

85-
let mut render_pass = target
86-
.render_pass(view_entity, Some(depth))
87-
.label("main_opaque_pass_3d")
88-
.color_ops(
89-
match camera_3d.clear_color {
90-
ClearColorConfig::Default => {
91-
LoadOp::Clear(world.resource::<ClearColor>().0.into())
92-
}
93-
ClearColorConfig::Custom(color) => LoadOp::Clear(color.into()),
94-
ClearColorConfig::None => LoadOp::Load,
95-
},
96-
true,
97-
)
98-
.depth_ops(
99-
if depth_prepass.is_some() || normal_prepass.is_some() {
100-
// if any prepass runs, it will generate a depth buffer so we should use it,
101-
// even if only the normal_prepass is used.
102-
Camera3dDepthLoadOp::Load
103-
} else {
104-
// NOTE: 0.0 is the far plane due to bevy's use of reverse-z projections.
105-
camera_3d.depth_load_op.clone()
106-
}
107-
.into(),
108-
true,
109-
)
110-
.begin(render_context);
111-
render_pass
82+
let depth_load_op = if depth_prepass.is_some() || normal_prepass.is_some() {
83+
// if any prepass runs, it will generate a depth buffer so we should use it,
84+
// even if only the normal_prepass is used.
85+
LoadOp::Load
86+
} else {
87+
camera_3d.depth_load_op.clone().into()
88+
};
89+
90+
render_context
91+
.render_pass(view_entity)
92+
.set_label("main_opaque_pass_3d")
93+
.add_view_target(target)
94+
.set_color_ops(camera_3d.clear_color.load_op(world), true)
95+
.set_depth_stencil_attachment(&depth.view)
96+
.set_depth_ops(depth_load_op, true)
97+
.begin()
11298
.set_camera_viewport(camera)
11399
.render_phase(opaque_phase, world);
114100
}
@@ -119,13 +105,14 @@ impl Node for MainPass3dNode {
119105
#[cfg(feature = "trace")]
120106
let _main_alpha_mask_pass_3d_span = info_span!("main_alpha_mask_pass_3d").entered();
121107

122-
let mut render_pass = target
123-
.render_pass(view_entity, Some(depth))
124-
.label("main_alpha_mask_pass_3d")
125-
.color_ops(LoadOp::Load, true)
126-
.depth_ops(LoadOp::Load, true)
127-
.begin(render_context);
128-
render_pass
108+
render_context
109+
.render_pass(view_entity)
110+
.set_label("main_alpha_mask_pass_3d")
111+
.add_view_target(target)
112+
.set_color_ops(LoadOp::Load, true)
113+
.set_depth_stencil_attachment(&depth.view)
114+
.set_depth_ops(LoadOp::Load, true)
115+
.begin()
129116
.set_camera_viewport(camera)
130117
.render_phase(alpha_mask_phase, world);
131118
}
@@ -142,13 +129,14 @@ impl Node for MainPass3dNode {
142129
// so that wgpu does not clear the depth buffer.
143130
// As the opaque and alpha mask passes run first, opaque meshes can occlude
144131
// transparent ones.
145-
let mut render_pass = target
146-
.render_pass(view_entity, Some(depth))
147-
.label("main_transparent_pass_3d")
148-
.color_ops(LoadOp::Load, true)
149-
.depth_ops(LoadOp::Load, true)
150-
.begin(render_context);
151-
render_pass
132+
render_context
133+
.render_pass(view_entity)
134+
.set_label("main_transparent_pass_3d")
135+
.add_view_target(target)
136+
.set_color_ops(LoadOp::Load, true)
137+
.set_depth_stencil_attachment(&depth.view)
138+
.set_depth_ops(LoadOp::Load, true)
139+
.begin()
152140
.set_camera_viewport(camera)
153141
.render_phase(transparent_phase, world);
154142
}
@@ -160,11 +148,12 @@ impl Node for MainPass3dNode {
160148
#[cfg(feature = "trace")]
161149
let _reset_viewport_pass_3d = info_span!("reset_viewport_pass_3d").entered();
162150

163-
target
164-
.render_pass(view_entity, None)
165-
.label("reset_viewport_pass_3d")
166-
.color_ops(LoadOp::Load, true)
167-
.begin(render_context);
151+
render_context
152+
.render_pass(view_entity)
153+
.set_label("reset_viewport_pass_3d")
154+
.add_view_target(target)
155+
.set_color_ops(LoadOp::Load, true)
156+
.begin();
168157
}
169158

170159
Ok(())

0 commit comments

Comments
 (0)