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
	 IceSentry
						IceSentry