Move prepass functions to prepass_utils (#7354)
# Objective - The functions added to utils.wgsl by the prepass assume that mesh_view_bindings are present, which isn't always the case - Fixes https://github.com/bevyengine/bevy/issues/7353 ## Solution - Move these functions to their own `prepass_utils.wgsl` file Co-authored-by: IceSentry <IceSentry@users.noreply.github.com>
This commit is contained in:
parent
cf612c8349
commit
3c63c0dab7
@ -1,6 +1,6 @@
|
|||||||
#import bevy_pbr::mesh_types
|
#import bevy_pbr::mesh_types
|
||||||
#import bevy_pbr::mesh_view_bindings
|
#import bevy_pbr::mesh_view_bindings
|
||||||
#import bevy_pbr::utils
|
#import bevy_pbr::prepass_utils
|
||||||
|
|
||||||
@group(1) @binding(0)
|
@group(1) @binding(0)
|
||||||
var<uniform> show_depth: f32;
|
var<uniform> show_depth: f32;
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
//! it will always create a depth buffer that will be used by the main pass.
|
//! it will always create a depth buffer that will be used by the main pass.
|
||||||
//!
|
//!
|
||||||
//! When using the default mesh view bindings you should be able to use `prepass_depth()`
|
//! When using the default mesh view bindings you should be able to use `prepass_depth()`
|
||||||
//! and `prepass_normal()` to load the related textures. These functions are defined in `bevy_pbr::utils`.
|
//! and `prepass_normal()` to load the related textures. These functions are defined in `bevy_pbr::prepass_utils`.
|
||||||
//! See the `shader_prepass` example that shows how to use it.
|
//! See the `shader_prepass` example that shows how to use it.
|
||||||
//!
|
//!
|
||||||
//! The prepass runs for each `Material`. You can control if the prepass should run per-material by setting the `prepass_enabled`
|
//! The prepass runs for each `Material`. You can control if the prepass should run per-material by setting the `prepass_enabled`
|
||||||
|
|||||||
@ -57,6 +57,9 @@ pub const PREPASS_SHADER_HANDLE: HandleUntyped =
|
|||||||
pub const PREPASS_BINDINGS_SHADER_HANDLE: HandleUntyped =
|
pub const PREPASS_BINDINGS_SHADER_HANDLE: HandleUntyped =
|
||||||
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 5533152893177403494);
|
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 5533152893177403494);
|
||||||
|
|
||||||
|
pub const PREPASS_UTILS_SHADER_HANDLE: HandleUntyped =
|
||||||
|
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 4603948296044544);
|
||||||
|
|
||||||
pub struct PrepassPlugin<M: Material>(PhantomData<M>);
|
pub struct PrepassPlugin<M: Material>(PhantomData<M>);
|
||||||
|
|
||||||
impl<M: Material> Default for PrepassPlugin<M> {
|
impl<M: Material> Default for PrepassPlugin<M> {
|
||||||
@ -84,6 +87,13 @@ where
|
|||||||
Shader::from_wgsl
|
Shader::from_wgsl
|
||||||
);
|
);
|
||||||
|
|
||||||
|
load_internal_asset!(
|
||||||
|
app,
|
||||||
|
PREPASS_UTILS_SHADER_HANDLE,
|
||||||
|
"prepass_utils.wgsl",
|
||||||
|
Shader::from_wgsl
|
||||||
|
);
|
||||||
|
|
||||||
let Ok(render_app) = app.get_sub_app_mut(RenderApp) else {
|
let Ok(render_app) = app.get_sub_app_mut(RenderApp) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|||||||
23
crates/bevy_pbr/src/prepass/prepass_utils.wgsl
Normal file
23
crates/bevy_pbr/src/prepass/prepass_utils.wgsl
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#define_import_path bevy_pbr::prepass_utils
|
||||||
|
|
||||||
|
#ifndef NORMAL_PREPASS
|
||||||
|
fn prepass_normal(frag_coord: vec4<f32>, sample_index: u32) -> vec3<f32> {
|
||||||
|
#ifdef MULTISAMPLED
|
||||||
|
let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), i32(sample_index));
|
||||||
|
#else
|
||||||
|
let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), 0);
|
||||||
|
#endif
|
||||||
|
return normal_sample.xyz * 2.0 - vec3(1.0);
|
||||||
|
}
|
||||||
|
#endif // NORMAL_PREPASS
|
||||||
|
|
||||||
|
#ifndef DEPTH_PREPASS
|
||||||
|
fn prepass_depth(frag_coord: vec4<f32>, sample_index: u32) -> f32 {
|
||||||
|
#ifdef MULTISAMPLED
|
||||||
|
let depth_sample = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), i32(sample_index));
|
||||||
|
#else
|
||||||
|
let depth_sample = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), 0);
|
||||||
|
#endif
|
||||||
|
return depth_sample;
|
||||||
|
}
|
||||||
|
#endif // DEPTH_PREPASS
|
||||||
@ -25,25 +25,3 @@ fn random1D(s: f32) -> f32 {
|
|||||||
fn coords_to_viewport_uv(position: vec2<f32>, viewport: vec4<f32>) -> vec2<f32> {
|
fn coords_to_viewport_uv(position: vec2<f32>, viewport: vec4<f32>) -> vec2<f32> {
|
||||||
return (position - viewport.xy) / viewport.zw;
|
return (position - viewport.xy) / viewport.zw;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NORMAL_PREPASS
|
|
||||||
fn prepass_normal(frag_coord: vec4<f32>, sample_index: u32) -> vec3<f32> {
|
|
||||||
#ifdef MULTISAMPLED
|
|
||||||
let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), i32(sample_index));
|
|
||||||
#else
|
|
||||||
let normal_sample = textureLoad(normal_prepass_texture, vec2<i32>(frag_coord.xy), 0);
|
|
||||||
#endif
|
|
||||||
return normal_sample.xyz * 2.0 - vec3(1.0);
|
|
||||||
}
|
|
||||||
#endif // NORMAL_PREPASS
|
|
||||||
|
|
||||||
#ifndef DEPTH_PREPASS
|
|
||||||
fn prepass_depth(frag_coord: vec4<f32>, sample_index: u32) -> f32 {
|
|
||||||
#ifdef MULTISAMPLED
|
|
||||||
let depth_sample = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), i32(sample_index));
|
|
||||||
#else
|
|
||||||
let depth_sample = textureLoad(depth_prepass_texture, vec2<i32>(frag_coord.xy), 0);
|
|
||||||
#endif
|
|
||||||
return depth_sample;
|
|
||||||
}
|
|
||||||
#endif // DEPTH_PREPASS
|
|
||||||
Loading…
Reference in New Issue
Block a user