33//! The raster projection selects the shadow volume and atlas UVs. Fragment depth stores normalized
44//! radial distance so point and spot shadows compare consistently across their projected views.
55
6- struct ShadowCasterUniforms {
7- view_proj_left : mat4x4 <f32 >,
8- view_proj_right : mat4x4 <f32 >,
6+ struct ShadowCasterDraw {
97 model : mat4x4 <f32 >,
108 normal_matrix : mat3x3 <f32 >,
9+ _pad : array <vec4 <f32 >, 25 >,
10+ }
11+
12+ struct ShadowLayerUniforms {
13+ view_proj : mat4x4 <f32 >,
1114 light_position_range : vec4 <f32 >,
1215 shadow_params : vec4 <f32 >,
13- _pad : array <vec4 <f32 >, 15 >,
16+ _pad : array <vec4 <f32 >, 26 >,
1417}
1518
16- @group (0 ) @binding (0 ) var <storage , read > instances : array <ShadowCasterUniforms >;
19+ @group (0 ) @binding (0 ) var <storage , read > instances : array <ShadowCasterDraw >;
20+ @group (1 ) @binding (0 ) var <uniform > shadow_layer : ShadowLayerUniforms ;
1721
1822struct VertexOutput {
1923 @builtin (position ) clip_pos : vec4 <f32 >,
@@ -30,17 +34,16 @@ fn vs_main(
3034 let world_p = draw . model * vec4 <f32 >(pos . xyz , 1 .0 );
3135
3236 var out : VertexOutput ;
33- out . clip_pos = draw . view_proj_left * world_p ;
37+ out . clip_pos = shadow_layer . view_proj * world_p ;
3438 out . world_pos = world_p . xyz ;
3539 out . instance_index = instance_index ;
3640 return out ;
3741}
3842
3943@fragment
4044fn fs_main (in : VertexOutput ) -> @builtin (frag_depth ) f32 {
41- let draw = instances [in . instance_index ];
42- let range = max (draw . light_position_range . w , 0 .001 );
43- let bias = max (draw . shadow_params . x , 0 .0 );
44- let radial_depth = (length (in . world_pos - draw . light_position_range . xyz ) + bias ) / range ;
45+ let range = max (shadow_layer . light_position_range . w , 0 .001 );
46+ let bias = max (shadow_layer . shadow_params . x , 0 .0 );
47+ let radial_depth = (length (in . world_pos - shadow_layer . light_position_range . xyz ) + bias ) / range ;
4548 return clamp (radial_depth , 0 .0 , 1 .0 );
4649}
0 commit comments