@@ -3,6 +3,7 @@ pub mod window;
33
44use bevy_camera:: {
55 primitives:: Frustum , CameraMainTextureUsages , ClearColor , ClearColorConfig , Exposure ,
6+ MainPassResolutionOverride ,
67} ;
78use bevy_diagnostic:: FrameCount ;
89pub use visibility:: * ;
@@ -568,6 +569,7 @@ pub struct ViewUniform {
568569 pub exposure : f32 ,
569570 // viewport(x_origin, y_origin, width, height)
570571 pub viewport : Vec4 ,
572+ pub main_pass_viewport : Vec4 ,
571573 /// 6 world-space half spaces (normal: vec3, distance: f32) ordered left, right, top, bottom, near, far.
572574 /// The normal vectors point towards the interior of the frustum.
573575 /// A half space contains `p` if `normal.dot(p) + distance > 0.`
@@ -901,6 +903,7 @@ pub fn prepare_view_uniforms(
901903 Option < & Frustum > ,
902904 Option < & TemporalJitter > ,
903905 Option < & MipBias > ,
906+ Option < & MainPassResolutionOverride > ,
904907 ) > ,
905908 frame_count : Res < FrameCount > ,
906909) {
@@ -913,13 +916,28 @@ pub fn prepare_view_uniforms(
913916 else {
914917 return ;
915918 } ;
916- for ( entity, extracted_camera, extracted_view, frustum, temporal_jitter, mip_bias) in & views {
919+ for (
920+ entity,
921+ extracted_camera,
922+ extracted_view,
923+ frustum,
924+ temporal_jitter,
925+ mip_bias,
926+ resolution_override,
927+ ) in & views
928+ {
917929 let viewport = extracted_view. viewport . as_vec4 ( ) ;
930+ let mut main_pass_viewport = viewport;
931+ if let Some ( resolution_override) = resolution_override {
932+ main_pass_viewport. z = resolution_override. 0 . x as f32 ;
933+ main_pass_viewport. w = resolution_override. 0 . y as f32 ;
934+ }
935+
918936 let unjittered_projection = extracted_view. clip_from_view ;
919937 let mut clip_from_view = unjittered_projection;
920938
921939 if let Some ( temporal_jitter) = temporal_jitter {
922- temporal_jitter. jitter_projection ( & mut clip_from_view, viewport . zw ( ) ) ;
940+ temporal_jitter. jitter_projection ( & mut clip_from_view, main_pass_viewport . zw ( ) ) ;
923941 }
924942
925943 let view_from_clip = clip_from_view. inverse ( ) ;
@@ -953,6 +971,7 @@ pub fn prepare_view_uniforms(
953971 . map ( |c| c. exposure )
954972 . unwrap_or_else ( || Exposure :: default ( ) . exposure ( ) ) ,
955973 viewport,
974+ main_pass_viewport,
956975 frustum,
957976 color_grading : extracted_view. color_grading . clone ( ) . into ( ) ,
958977 mip_bias : mip_bias. unwrap_or ( & MipBias ( 0.0 ) ) . 0 ,
0 commit comments