Skip to main content

bevy_pbr/prepass/
prepass_bindings.rs

1use 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        // Depth texture
20        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        // Normal texture
29        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        // Motion Vectors texture
40        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        // Deferred texture
51        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}