bevy_pbr/prepass/
prepass_bindings.rs1use bevy_core_pipeline::prepass::ViewPrepassTextures;
2use bevy_render::render_resource::{
3 binding_types::{
4 texture_2d, texture_2d_multisampled, texture_depth_2d, texture_depth_2d_multisampled,
5 },
6 BindGroupLayoutEntryBuilder, TextureSampleType, TextureView,
7};
8
9use crate::MeshPipelineViewLayoutKey;
10
11pub fn get_bind_group_layout_entries(
12 layout_key: MeshPipelineViewLayoutKey,
13) -> [Option<BindGroupLayoutEntryBuilder>; 4] {
14 let mut entries: [Option<BindGroupLayoutEntryBuilder>; 4] = [None; 4];
15
16 let multisampled = layout_key.contains(MeshPipelineViewLayoutKey::MULTISAMPLED);
17
18 if layout_key.contains(MeshPipelineViewLayoutKey::DEPTH_PREPASS) {
19 entries[0] = if multisampled {
21 Some(texture_depth_2d_multisampled())
22 } else {
23 Some(texture_depth_2d())
24 };
25 }
26
27 if layout_key.contains(MeshPipelineViewLayoutKey::NORMAL_PREPASS) {
28 entries[1] = if multisampled {
30 Some(texture_2d_multisampled(TextureSampleType::Float {
31 filterable: false,
32 }))
33 } else {
34 Some(texture_2d(TextureSampleType::Float { filterable: false }))
35 };
36 }
37
38 if layout_key.contains(MeshPipelineViewLayoutKey::MOTION_VECTOR_PREPASS) {
39 entries[2] = if multisampled {
41 Some(texture_2d_multisampled(TextureSampleType::Float {
42 filterable: false,
43 }))
44 } else {
45 Some(texture_2d(TextureSampleType::Float { filterable: false }))
46 };
47 }
48
49 if layout_key.contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS) {
50 entries[3] = Some(texture_2d(TextureSampleType::Uint));
52 }
53
54 entries
55}
56
57pub fn get_bindings(prepass_textures: Option<&ViewPrepassTextures>) -> [Option<TextureView>; 4] {
58 [
59 prepass_textures.and_then(|pt| pt.depth_only_view().cloned()),
60 prepass_textures.and_then(|pt| pt.normal_view().cloned()),
61 prepass_textures.and_then(|pt| pt.motion_vectors_view().cloned()),
62 prepass_textures.and_then(|pt| pt.deferred_view().cloned()),
63 ]
64}