77//! layout at pipeline creation for storage-backed frame resources.
88//!
99//! CPU packing must match [`crate::gpu::frame_globals::FrameGpuUniforms`],
10- //! [`crate::backend::light_gpu::GpuLight`], and [`crate::backend::cluster_gpu`] cluster buffers.
10+ //! [`crate::backend::light_gpu::GpuLight`], [`crate::gpu::GpuLightCookieRect`], and
11+ //! [`crate::backend::cluster_gpu`] cluster buffers.
1112
1213#define_import_path renderide :: frame :: globals
1314
2627@group (0 ) @binding (10 ) var reflection_probe_specular_sampler : sampler ;
2728@group (0 ) @binding (11 ) var ibl_dfg_lut : texture_2d <f32 >;
2829@group (0 ) @binding (12 ) var <storage , read > reflection_probes : array <ft :: GpuReflectionProbe >;
29- @group (0 ) @binding (13 ) var light_cookie_2d_atlas : texture_2d_array <f32 >;
30- @group (0 ) @binding (14 ) var light_cookie_point_atlas : texture_2d_array <f32 >;
30+ @group (0 ) @binding (13 ) var light_cookie_2d_atlas : texture_2d <f32 >;
31+ @group (0 ) @binding (14 ) var light_cookie_point_atlas : texture_2d <f32 >;
3132@group (0 ) @binding (15 ) var light_cookie_sampler : sampler ;
3233@group (0 ) @binding (16 ) var <storage , read > shadow_views : array <ft :: GpuShadowView >;
3334@group (0 ) @binding (17 ) var shadow_atlas : texture_depth_2d_array ;
3435@group (0 ) @binding (18 ) var shadow_sampler : sampler_comparison ;
36+ @group (0 ) @binding (19 ) var <storage , read > light_cookie_rects : array <ft :: GpuLightCookieRect >;
3537
3638/// View index encoded in a material varying.
3739fn view_index_from_layer (view_layer : u32 ) -> u32 {
@@ -43,10 +45,19 @@ fn draw_index_from_layer(view_layer: u32) -> u32 {
4345 return view_layer >> 1u ;
4446}
4547
48+ /// Returns true when the encoded material view layer targets the right eye.
49+ fn view_layer_is_right_eye (view_layer : u32 ) -> bool {
50+ #ifdef MULTIVIEW
51+ return view_index_from_layer (view_layer ) != 0u ;
52+ #else
53+ return false ;
54+ #endif
55+ }
56+
4657/// World-space camera position for the current view layer.
4758fn camera_world_pos_for_view (view_layer : u32 ) -> vec3 <f32 > {
4859#ifdef MULTIVIEW
49- if (view_index_from_layer (view_layer ) != 0u ) {
60+ if (view_layer_is_right_eye (view_layer )) {
5061 return frame . camera_world_pos_right . xyz ;
5162 }
5263#endif
@@ -65,7 +76,7 @@ fn stereo_center_camera_world_pos() -> vec3<f32> {
6576/// World -> view-space Z coefficients for the current view layer.
6677fn view_space_z_coeffs_for_view (view_layer : u32 ) -> vec4 <f32 > {
6778#ifdef MULTIVIEW
68- if (view_index_from_layer (view_layer ) != 0u ) {
79+ if (view_layer_is_right_eye (view_layer )) {
6980 return frame . view_space_z_coeffs_right ;
7081 }
7182#endif
@@ -75,7 +86,7 @@ fn view_space_z_coeffs_for_view(view_layer: u32) -> vec4<f32> {
7586/// View -> world-space Y coefficients for the current view layer.
7687fn view_to_world_y_coeffs_for_view (view_layer : u32 ) -> vec4 <f32 > {
7788#ifdef MULTIVIEW
78- if (view_index_from_layer (view_layer ) != 0u ) {
89+ if (view_layer_is_right_eye (view_layer )) {
7990 return frame . view_to_world_y_coeffs_right ;
8091 }
8192#endif
@@ -85,7 +96,7 @@ fn view_to_world_y_coeffs_for_view(view_layer: u32) -> vec4<f32> {
8596/// Projection coefficients for the current view layer.
8697fn proj_params_for_view (view_layer : u32 ) -> vec4 <f32 > {
8798#ifdef MULTIVIEW
88- if (view_index_from_layer (view_layer ) != 0u ) {
99+ if (view_layer_is_right_eye (view_layer )) {
89100 return frame . proj_params_right ;
90101 }
91102#endif
@@ -95,7 +106,7 @@ fn proj_params_for_view(view_layer: u32) -> vec4<f32> {
95106/// Projection matrix for the current view layer.
96107fn projection_for_view (view_layer : u32 ) -> mat4x4 <f32 > {
97108#ifdef MULTIVIEW
98- if (view_index_from_layer (view_layer ) != 0u ) {
109+ if (view_layer_is_right_eye (view_layer )) {
99110 return frame . proj_right ;
100111 }
101112#endif
@@ -105,7 +116,7 @@ fn projection_for_view(view_layer: u32) -> mat4x4<f32> {
105116/// Projection flags for the current view layer.
106117fn projection_flags_for_view (view_layer : u32 ) -> u32 {
107118#ifdef MULTIVIEW
108- if (view_index_from_layer (view_layer ) != 0u ) {
119+ if (view_layer_is_right_eye (view_layer )) {
109120 return frame . frame_tail . z ;
110121 }
111122#endif
@@ -174,7 +185,8 @@ fn retain_globals_additive(color: vec4<f32>) -> vec4<f32> {
174185 f32 (cluster_light_indices [0u ] & 255u ) * 1e-10 ;
175186 let probe_touch = reflection_probes [0u ]. params . x * 1e-10 ;
176187 let cookie_touch =
177- textureSampleLevel (light_cookie_2d_atlas , light_cookie_sampler , vec2 <f32 >(0 .5 ), 0 , 0 .0 ). r * 1e-10 +
178- textureSampleLevel (light_cookie_point_atlas , light_cookie_sampler , vec2 <f32 >(0 .5 ), 0 , 0 .0 ). r * 1e-10 ;
188+ textureSampleLevel (light_cookie_2d_atlas , light_cookie_sampler , vec2 <f32 >(0 .5 ), 0 .0 ). r * 1e-10 +
189+ textureSampleLevel (light_cookie_point_atlas , light_cookie_sampler , vec2 <f32 >(0 .5 ), 0 .0 ). r * 1e-10 +
190+ light_cookie_rects [0u ]. origin_scale . x * 1e-10 ;
179191 return color + vec4 <f32 >(vec3 <f32 >(f32 (lit ) * 1e-10 + cluster_touch + probe_touch + cookie_touch ), 0 .0 );
180192}
0 commit comments