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)
This commit is contained in:
JMS55 2023-08-17 12:46:43 -07:00 committed by Carter Anderson
parent 657c14026a
commit 94e81c2855
2 changed files with 12 additions and 5 deletions

View file

@ -19,7 +19,7 @@ use bevy_ecs::{
system::{Commands, Query, Res, ResMut, Resource}, system::{Commands, Query, Res, ResMut, Resource},
}; };
use bevy_log::warn; 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_reflect::prelude::*;
use bevy_transform::components::GlobalTransform; use bevy_transform::components::GlobalTransform;
use bevy_utils::{HashMap, HashSet}; use bevy_utils::{HashMap, HashSet};
@ -769,7 +769,8 @@ impl TemporalJitter {
return; 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.x += jitter.x;
projection.z_axis.y += jitter.y; projection.z_axis.y += jitter.y;

View file

@ -375,11 +375,17 @@ pub fn prepare_view_uniforms(
let view = camera.transform.compute_matrix(); let view = camera.transform.compute_matrix();
let inverse_view = view.inverse(); 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 { let view_uniforms = ViewUniformOffset {
offset: view_uniforms.uniforms.push(ViewUniform { offset: view_uniforms.uniforms.push(ViewUniform {
view_proj: camera view_proj,
.view_projection
.unwrap_or_else(|| projection * inverse_view),
unjittered_view_proj: unjittered_projection * inverse_view, unjittered_view_proj: unjittered_projection * inverse_view,
inverse_view_proj: view * inverse_projection, inverse_view_proj: view * inverse_projection,
view, view,