Skip to content

Commit 5fac1fe

Browse files
authored
Fix temporal jitter bug (#9462)
* Fixed jitter being applied in the wrong coordinate space, leading to aliasing. * Fixed incorrectly using the cached view_proj instead of account for temporal jitter. * Added a diagram to ensure the coordinate space is clear. Before: ![image](https://github.com/bevyengine/bevy/assets/47158642/55b4bed4-4fb0-4fb2-a271-cc10a987e4d7) After: ![image](https://github.com/bevyengine/bevy/assets/47158642/cbde4553-4e35-44d9-8ccf-f3a06e64a31f)
1 parent 9473726 commit 5fac1fe

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

crates/bevy_render/src/camera/camera.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use bevy_ecs::{
1919
system::{Commands, Query, Res, ResMut, Resource},
2020
};
2121
use bevy_log::warn;
22-
use bevy_math::{Mat4, Ray, Rect, URect, UVec2, UVec4, Vec2, Vec3};
22+
use bevy_math::{vec2, Mat4, Ray, Rect, URect, UVec2, UVec4, Vec2, Vec3};
2323
use bevy_reflect::prelude::*;
2424
use bevy_transform::components::GlobalTransform;
2525
use bevy_utils::{HashMap, HashSet};
@@ -806,7 +806,8 @@ impl TemporalJitter {
806806
return;
807807
}
808808

809-
let jitter = self.offset / view_size;
809+
// https://github.com/GPUOpen-LibrariesAndSDKs/FidelityFX-SDK/blob/d7531ae47d8b36a5d4025663e731a47a38be882f/docs/techniques/media/super-resolution-temporal/jitter-space.svg
810+
let jitter = (self.offset * vec2(2.0, -2.0)) / view_size;
810811

811812
projection.z_axis.x += jitter.x;
812813
projection.z_axis.y += jitter.y;

crates/bevy_render/src/view/mod.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -375,11 +375,17 @@ pub fn prepare_view_uniforms(
375375
let view = camera.transform.compute_matrix();
376376
let inverse_view = view.inverse();
377377

378+
let view_proj = if temporal_jitter.is_some() {
379+
projection * inverse_view
380+
} else {
381+
camera
382+
.view_projection
383+
.unwrap_or_else(|| projection * inverse_view)
384+
};
385+
378386
let view_uniforms = ViewUniformOffset {
379387
offset: view_uniforms.uniforms.push(ViewUniform {
380-
view_proj: camera
381-
.view_projection
382-
.unwrap_or_else(|| projection * inverse_view),
388+
view_proj,
383389
unjittered_view_proj: unjittered_projection * inverse_view,
384390
inverse_view_proj: view * inverse_projection,
385391
view,

0 commit comments

Comments
 (0)