1
1
use crate :: {
2
- clear_color:: { ClearColor , ClearColorConfig } ,
3
2
core_3d:: { AlphaMask3d , Camera3d , Opaque3d , Transparent3d } ,
4
3
prepass:: { DepthPrepass , NormalPrepass } ,
5
4
} ;
@@ -8,15 +7,13 @@ use bevy_render::{
8
7
camera:: ExtractedCamera ,
9
8
render_graph:: { Node , NodeRunError , RenderGraphContext , SlotInfo , SlotType } ,
10
9
render_phase:: RenderPhase ,
11
- render_resource:: { LoadOp , Operations , RenderPassDepthStencilAttachment , RenderPassDescriptor } ,
10
+ render_resource:: LoadOp ,
12
11
renderer:: RenderContext ,
13
12
view:: { ExtractedView , ViewDepthTexture , ViewTarget } ,
14
13
} ;
15
14
#[ cfg( feature = "trace" ) ]
16
15
use bevy_utils:: tracing:: info_span;
17
16
18
- use super :: Camera3dDepthLoadOp ;
19
-
20
17
pub struct MainPass3dNode {
21
18
query : QueryState <
22
19
(
@@ -82,44 +79,24 @@ impl Node for MainPass3dNode {
82
79
#[ cfg( feature = "trace" ) ]
83
80
let _main_opaque_pass_3d_span = info_span ! ( "main_opaque_pass_3d" ) . entered ( ) ;
84
81
85
- let mut render_pass = render_context. begin_tracked_render_pass ( RenderPassDescriptor {
86
- label : Some ( "main_opaque_pass_3d" ) ,
87
- // NOTE: The opaque pass loads the color
88
- // buffer as well as writing to it.
89
- color_attachments : & [ Some ( target. get_color_attachment ( Operations {
90
- load : match camera_3d. clear_color {
91
- ClearColorConfig :: Default => {
92
- LoadOp :: Clear ( world. resource :: < ClearColor > ( ) . 0 . into ( ) )
93
- }
94
- ClearColorConfig :: Custom ( color) => LoadOp :: Clear ( color. into ( ) ) ,
95
- ClearColorConfig :: None => LoadOp :: Load ,
96
- } ,
97
- store : true ,
98
- } ) ) ] ,
99
- depth_stencil_attachment : Some ( RenderPassDepthStencilAttachment {
100
- view : & depth. view ,
101
- // NOTE: The opaque main pass loads the depth buffer and possibly overwrites it
102
- depth_ops : Some ( Operations {
103
- load : if depth_prepass. is_some ( ) || normal_prepass. is_some ( ) {
104
- // if any prepass runs, it will generate a depth buffer so we should use it,
105
- // even if only the normal_prepass is used.
106
- Camera3dDepthLoadOp :: Load
107
- } else {
108
- // NOTE: 0.0 is the far plane due to bevy's use of reverse-z projections.
109
- camera_3d. depth_load_op . clone ( )
110
- }
111
- . into ( ) ,
112
- store : true ,
113
- } ) ,
114
- stencil_ops : None ,
115
- } ) ,
116
- } ) ;
117
-
118
- if let Some ( viewport) = camera. viewport . as_ref ( ) {
119
- render_pass. set_camera_viewport ( viewport) ;
120
- }
121
-
122
- opaque_phase. render ( & mut render_pass, world, view_entity) ;
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 ( )
98
+ . set_camera_viewport ( camera)
99
+ . render_phase ( opaque_phase, world) ;
123
100
}
124
101
125
102
if !alpha_mask_phase. items . is_empty ( ) {
@@ -128,29 +105,16 @@ impl Node for MainPass3dNode {
128
105
#[ cfg( feature = "trace" ) ]
129
106
let _main_alpha_mask_pass_3d_span = info_span ! ( "main_alpha_mask_pass_3d" ) . entered ( ) ;
130
107
131
- let mut render_pass = render_context. begin_tracked_render_pass ( RenderPassDescriptor {
132
- label : Some ( "main_alpha_mask_pass_3d" ) ,
133
- // NOTE: The alpha_mask pass loads the color buffer as well as overwriting it where appropriate.
134
- color_attachments : & [ Some ( target. get_color_attachment ( Operations {
135
- load : LoadOp :: Load ,
136
- store : true ,
137
- } ) ) ] ,
138
- depth_stencil_attachment : Some ( RenderPassDepthStencilAttachment {
139
- view : & depth. view ,
140
- // NOTE: The alpha mask pass loads the depth buffer and possibly overwrites it
141
- depth_ops : Some ( Operations {
142
- load : LoadOp :: Load ,
143
- store : true ,
144
- } ) ,
145
- stencil_ops : None ,
146
- } ) ,
147
- } ) ;
148
-
149
- if let Some ( viewport) = camera. viewport . as_ref ( ) {
150
- render_pass. set_camera_viewport ( viewport) ;
151
- }
152
-
153
- alpha_mask_phase. render ( & mut render_pass, world, view_entity) ;
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 ( )
116
+ . set_camera_viewport ( camera)
117
+ . render_phase ( alpha_mask_phase, world) ;
154
118
}
155
119
156
120
if !transparent_phase. items . is_empty ( ) {
@@ -159,34 +123,22 @@ impl Node for MainPass3dNode {
159
123
#[ cfg( feature = "trace" ) ]
160
124
let _main_transparent_pass_3d_span = info_span ! ( "main_transparent_pass_3d" ) . entered ( ) ;
161
125
162
- let mut render_pass = render_context. begin_tracked_render_pass ( RenderPassDescriptor {
163
- label : Some ( "main_transparent_pass_3d" ) ,
164
- // NOTE: The transparent pass loads the color buffer as well as overwriting it where appropriate.
165
- color_attachments : & [ Some ( target. get_color_attachment ( Operations {
166
- load : LoadOp :: Load ,
167
- store : true ,
168
- } ) ) ] ,
169
- depth_stencil_attachment : Some ( RenderPassDepthStencilAttachment {
170
- view : & depth. view ,
171
- // NOTE: For the transparent pass we load the depth buffer. There should be no
172
- // need to write to it, but store is set to `true` as a workaround for issue #3776,
173
- // https://github.com/bevyengine/bevy/issues/3776
174
- // so that wgpu does not clear the depth buffer.
175
- // As the opaque and alpha mask passes run first, opaque meshes can occlude
176
- // transparent ones.
177
- depth_ops : Some ( Operations {
178
- load : LoadOp :: Load ,
179
- store : true ,
180
- } ) ,
181
- stencil_ops : None ,
182
- } ) ,
183
- } ) ;
184
-
185
- if let Some ( viewport) = camera. viewport . as_ref ( ) {
186
- render_pass. set_camera_viewport ( viewport) ;
187
- }
188
-
189
- transparent_phase. render ( & mut render_pass, world, view_entity) ;
126
+ // NOTE: For the transparent pass we load the depth buffer. There should be no
127
+ // need to write to it, but store is set to `true` as a workaround for issue #3776,
128
+ // https://github.com/bevyengine/bevy/issues/3776
129
+ // so that wgpu does not clear the depth buffer.
130
+ // As the opaque and alpha mask passes run first, opaque meshes can occlude
131
+ // transparent ones.
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 ( )
140
+ . set_camera_viewport ( camera)
141
+ . render_phase ( transparent_phase, world) ;
190
142
}
191
143
192
144
// WebGL2 quirk: if ending with a render pass with a custom viewport, the viewport isn't
@@ -195,18 +147,13 @@ impl Node for MainPass3dNode {
195
147
if camera. viewport . is_some ( ) {
196
148
#[ cfg( feature = "trace" ) ]
197
149
let _reset_viewport_pass_3d = info_span ! ( "reset_viewport_pass_3d" ) . entered ( ) ;
198
- let pass_descriptor = RenderPassDescriptor {
199
- label : Some ( "reset_viewport_pass_3d" ) ,
200
- color_attachments : & [ Some ( target. get_color_attachment ( Operations {
201
- load : LoadOp :: Load ,
202
- store : true ,
203
- } ) ) ] ,
204
- depth_stencil_attachment : None ,
205
- } ;
206
150
207
151
render_context
208
- . command_encoder ( )
209
- . begin_render_pass ( & pass_descriptor) ;
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 ( ) ;
210
157
}
211
158
212
159
Ok ( ( ) )
0 commit comments