@@ -33,16 +33,11 @@ use crate::{
33
33
} ,
34
34
uniform:: { UniformBufferCache , UniformMemoryAllocator } ,
35
35
} ,
36
- flat_shader:: FlatShader ,
37
36
framework:: {
38
- buffer:: BufferUsage ,
39
- error:: FrameworkError ,
40
- framebuffer:: { BufferLocation , GpuFrameBuffer , ResourceBindGroup , ResourceBinding } ,
41
- geometry_buffer:: GpuGeometryBuffer ,
42
- server:: GraphicsServer ,
43
- uniform:: StaticUniformBuffer ,
44
- ColorMask , CompareFunc , CullFace , DrawParameters , ElementRange , GeometryBufferExt ,
45
- StencilAction , StencilFunc , StencilOp ,
37
+ buffer:: BufferUsage , error:: FrameworkError , framebuffer:: GpuFrameBuffer ,
38
+ geometry_buffer:: GpuGeometryBuffer , server:: GraphicsServer , ColorMask , CompareFunc ,
39
+ CullFace , DrawParameters , ElementRange , GeometryBufferExt , StencilAction , StencilFunc ,
40
+ StencilOp ,
46
41
} ,
47
42
gbuffer:: GBuffer ,
48
43
light_volume:: LightVolumeRenderer ,
@@ -78,12 +73,13 @@ pub struct DeferredLightRenderer {
78
73
sphere : GpuGeometryBuffer ,
79
74
cone : GpuGeometryBuffer ,
80
75
skybox : GpuGeometryBuffer ,
81
- flat_shader : FlatShader ,
82
76
skybox_shader : RenderPassContainer ,
83
77
spot_shadow_map_renderer : SpotShadowMapRenderer ,
84
78
point_shadow_map_renderer : PointShadowMapRenderer ,
85
79
csm_renderer : CsmRenderer ,
86
80
light_volume : LightVolumeRenderer ,
81
+ volume_marker : RenderPassContainer ,
82
+ pixel_counter : RenderPassContainer ,
87
83
}
88
84
89
85
pub ( crate ) struct DeferredRendererContext < ' a > {
@@ -209,7 +205,6 @@ impl DeferredLightRenderer {
209
205
BufferUsage :: StaticDraw ,
210
206
server,
211
207
) ?,
212
- flat_shader : FlatShader :: new ( server) ?,
213
208
skybox_shader : RenderPassContainer :: from_str (
214
209
server,
215
210
include_str ! ( "shaders/skybox.shader" ) ,
@@ -230,6 +225,14 @@ impl DeferredLightRenderer {
230
225
quality_defaults. csm_settings . size ,
231
226
quality_defaults. csm_settings . precision ,
232
227
) ?,
228
+ volume_marker : RenderPassContainer :: from_str (
229
+ server,
230
+ include_str ! ( "shaders/volume_marker_lit.shader" ) ,
231
+ ) ?,
232
+ pixel_counter : RenderPassContainer :: from_str (
233
+ server,
234
+ include_str ! ( "shaders/pixel_counter.shader" ) ,
235
+ ) ?,
233
236
} )
234
237
}
235
238
@@ -505,44 +508,39 @@ impl DeferredLightRenderer {
505
508
let mut light_view_projection = Matrix4 :: identity ( ) ;
506
509
507
510
// Mark lit areas in stencil buffer to do light calculations only on them.
508
- let uniform_buffer = uniform_buffer_cache. write (
509
- StaticUniformBuffer :: < 256 > :: new ( ) . with ( & ( view_projection * bounding_shape_matrix) ) ,
510
- ) ?;
511
-
511
+ let shape_wvp_matrix = view_projection * bounding_shape_matrix;
512
512
for ( cull_face, stencil_action) in [
513
513
( CullFace :: Front , StencilAction :: Incr ) ,
514
514
( CullFace :: Back , StencilAction :: Decr ) ,
515
515
] {
516
- pass_stats += frame_buffer. draw (
516
+ let draw_params = DrawParameters {
517
+ cull_face : Some ( cull_face) ,
518
+ color_write : ColorMask :: all ( false ) ,
519
+ depth_write : false ,
520
+ stencil_test : Some ( StencilFunc {
521
+ func : CompareFunc :: Always ,
522
+ ..Default :: default ( )
523
+ } ) ,
524
+ stencil_op : StencilOp {
525
+ zfail : stencil_action,
526
+ ..Default :: default ( )
527
+ } ,
528
+ depth_test : Some ( CompareFunc :: Less ) ,
529
+ blend : None ,
530
+ scissor_box : None ,
531
+ } ;
532
+ let properties =
533
+ PropertyGroup :: from ( [ property ( "worldViewProjection" , & shape_wvp_matrix) ] ) ;
534
+ let material = RenderMaterial :: from ( [ binding ( "properties" , & properties) ] ) ;
535
+ pass_stats += self . volume_marker . run_pass (
536
+ & ImmutableString :: new ( "Primary" ) ,
537
+ frame_buffer,
517
538
bounding_shape,
518
539
viewport,
519
- & self . flat_shader . program ,
520
- & DrawParameters {
521
- cull_face : Some ( cull_face) ,
522
- color_write : ColorMask :: all ( false ) ,
523
- depth_write : false ,
524
- stencil_test : Some ( StencilFunc {
525
- func : CompareFunc :: Always ,
526
- ..Default :: default ( )
527
- } ) ,
528
- stencil_op : StencilOp {
529
- zfail : stencil_action,
530
- ..Default :: default ( )
531
- } ,
532
- depth_test : Some ( CompareFunc :: Less ) ,
533
- blend : None ,
534
- scissor_box : None ,
535
- } ,
536
- & [ ResourceBindGroup {
537
- bindings : & [ ResourceBinding :: Buffer {
538
- buffer : uniform_buffer. clone ( ) ,
539
- binding : BufferLocation :: Auto {
540
- shader_location : self . flat_shader . uniform_buffer_binding ,
541
- } ,
542
- data_usage : Default :: default ( ) ,
543
- } ] ,
544
- } ] ,
545
- ElementRange :: Full ,
540
+ & material,
541
+ uniform_buffer_cache,
542
+ Default :: default ( ) ,
543
+ Some ( & draw_params) ,
546
544
) ?;
547
545
}
548
546
@@ -557,37 +555,19 @@ impl DeferredLightRenderer {
557
555
if visibility_cache. needs_occlusion_query ( camera_global_position, light. handle ) {
558
556
// Draw full screen quad, that will be used to count pixels that passed the stencil test
559
557
// on the stencil buffer's content generated by two previous drawing commands.
560
- let uniform_buffer = uniform_buffer_cache
561
- . write ( StaticUniformBuffer :: < 256 > :: new ( ) . with ( & frame_matrix) ) ?;
562
-
563
558
visibility_cache. begin_query ( server, camera_global_position, light. handle ) ?;
564
- pass_stats += frame_buffer. draw (
559
+ let properties =
560
+ PropertyGroup :: from ( [ property ( "worldViewProjection" , & frame_matrix) ] ) ;
561
+ let material = RenderMaterial :: from ( [ binding ( "properties" , & properties) ] ) ;
562
+ pass_stats += self . pixel_counter . run_pass (
563
+ & ImmutableString :: new ( "Primary" ) ,
564
+ frame_buffer,
565
565
& self . quad ,
566
566
viewport,
567
- & self . flat_shader . program ,
568
- & DrawParameters {
569
- cull_face : None ,
570
- color_write : ColorMask :: all ( false ) ,
571
- depth_write : false ,
572
- stencil_test : Some ( StencilFunc {
573
- func : CompareFunc :: NotEqual ,
574
- ..Default :: default ( )
575
- } ) ,
576
- depth_test : None ,
577
- blend : None ,
578
- stencil_op : Default :: default ( ) ,
579
- scissor_box : None ,
580
- } ,
581
- & [ ResourceBindGroup {
582
- bindings : & [ ResourceBinding :: Buffer {
583
- buffer : uniform_buffer,
584
- binding : BufferLocation :: Auto {
585
- shader_location : self . flat_shader . uniform_buffer_binding ,
586
- } ,
587
- data_usage : Default :: default ( ) ,
588
- } ] ,
589
- } ] ,
590
- ElementRange :: Full ,
567
+ & material,
568
+ uniform_buffer_cache,
569
+ Default :: default ( ) ,
570
+ None ,
591
571
) ?;
592
572
visibility_cache. end_query ( ) ;
593
573
}
0 commit comments