diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index 9c17416960..ac275feccd 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -19,7 +19,7 @@ use bevy_ecs::{ system::{Commands, Query, Res, ResMut, Resource}, }; use bevy_log::warn; -use bevy_math::{Mat4, Ray, Rect, UVec2, UVec4, Vec2, Vec3}; +use bevy_math::{vec2, Mat4, Ray, Rect, UVec2, UVec4, Vec2, Vec3}; use bevy_reflect::prelude::*; use bevy_transform::components::GlobalTransform; use bevy_utils::{HashMap, HashSet}; @@ -769,7 +769,8 @@ impl TemporalJitter { return; } - let jitter = self.offset / view_size; + // https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/d7531ae47d8b36a5d4025663e731a47a38be882f/docs/techniques/media/super-resolution-temporal/jitter-space.svg + let jitter = (self.offset * vec2(2.0, -2.0)) / view_size; projection.z_axis.x += jitter.x; projection.z_axis.y += jitter.y; diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index b2b773787c..9167279081 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -375,11 +375,17 @@ pub fn prepare_view_uniforms( let view = camera.transform.compute_matrix(); let inverse_view = view.inverse(); + let view_proj = if temporal_jitter.is_some() { + projection * inverse_view + } else { + camera + .view_projection + .unwrap_or_else(|| projection * inverse_view) + }; + let view_uniforms = ViewUniformOffset { offset: view_uniforms.uniforms.push(ViewUniform { - view_proj: camera - .view_projection - .unwrap_or_else(|| projection * inverse_view), + view_proj, unjittered_view_proj: unjittered_projection * inverse_view, inverse_view_proj: view * inverse_projection, view,