Fix: Motion blur should sample onscreen fragments with no depth (#13573)
# Objective - Motion blur does not currently work with skyboxes or anything else that does not write to depth. ## Solution - When computing blur, include fragments with no depth, as long as they are onscreen. ## Testing - Tested with the examples - the motion_blur example uncovered a bug with this fix, where offscreen pixels where now being sampled and causing artifacts. - Attached example showing the skybox being sampled in the blur (note the feathering on edges): https://github.com/bevyengine/bevy/assets/2632925/fc14b0c1-2394-46a5-a2b9-a859efcd23ef
This commit is contained in:
parent
c566ae7155
commit
16fe7e64cc
@ -79,6 +79,12 @@ fn fragment(
|
|||||||
// The current sample step vector, from in.uv
|
// The current sample step vector, from in.uv
|
||||||
let step_vector = 0.5 * exposure_vector * (f32(i) + noise) / f32(n_samples);
|
let step_vector = 0.5 * exposure_vector * (f32(i) + noise) / f32(n_samples);
|
||||||
var sample_uv = in.uv + step_vector;
|
var sample_uv = in.uv + step_vector;
|
||||||
|
|
||||||
|
// If the sample is off screen, skip it.
|
||||||
|
if sample_uv.x < 0.0 || sample_uv.x > 1.0 || sample_uv.y < 0.0 || sample_uv.y > 1.0 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let sample_coords = vec2<i32>(sample_uv * texture_size);
|
let sample_coords = vec2<i32>(sample_uv * texture_size);
|
||||||
|
|
||||||
#ifdef MULTISAMPLED
|
#ifdef MULTISAMPLED
|
||||||
@ -103,7 +109,10 @@ fn fragment(
|
|||||||
|
|
||||||
var weight = 1.0;
|
var weight = 1.0;
|
||||||
let is_sample_in_fg = !(depth_supported && sample_depth < this_depth && sample_depth > 0.0);
|
let is_sample_in_fg = !(depth_supported && sample_depth < this_depth && sample_depth > 0.0);
|
||||||
if is_sample_in_fg {
|
// If the depth is 0.0, this fragment has no depth written to it and we assume it is in the
|
||||||
|
// background. This ensures that things like skyboxes, which do not write to depth, are
|
||||||
|
// correctly sampled in motion blur.
|
||||||
|
if sample_depth != 0.0 && is_sample_in_fg {
|
||||||
// The following weight calculation is used to eliminate ghosting artifacts that are
|
// The following weight calculation is used to eliminate ghosting artifacts that are
|
||||||
// common in motion-vector-based motion blur implementations. While some resources
|
// common in motion-vector-based motion blur implementations. While some resources
|
||||||
// recommend using depth, I've found that sampling the velocity results in significantly
|
// recommend using depth, I've found that sampling the velocity results in significantly
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user