mirror of
https://github.com/bevyengine/bevy
synced 2024-12-22 19:13:08 +00:00
70b0eacc3b
# Objective - Custom render passes, or future passes in the engine (such as https://github.com/bevyengine/bevy/pull/10164) need a better way to know and indicate to the core passes whether the view color/depth/prepass attachments have been cleared or not yet this frame, to know if they should clear it themselves or load it. ## Solution - For all render targets (depth textures, shadow textures, prepass textures, main textures) use an atomic bool to track whether or not each texture has been cleared this frame. Abstracted away in the new ColorAttachment and DepthAttachment wrappers. --- ## Changelog - Changed `ViewTarget::get_color_attachment()`, removed arguments. - Changed `ViewTarget::get_unsampled_color_attachment()`, removed arguments. - Removed `Camera3d::clear_color`. - Removed `Camera2d::clear_color`. - Added `Camera::clear_color`. - Added `ExtractedCamera::clear_color`. - Added `ColorAttachment` and `DepthAttachment` wrappers. - Moved `ClearColor` and `ClearColorConfig` from `bevy::core_pipeline::clear_color` to `bevy::render::camera`. - Core render passes now track when a texture is first bound as an attachment in order to decide whether to clear or load it. ## Migration Guide - Remove arguments to `ViewTarget::get_color_attachment()` and `ViewTarget::get_unsampled_color_attachment()`. - Configure clear color on `Camera` instead of on `Camera3d` and `Camera2d`. - Moved `ClearColor` and `ClearColorConfig` from `bevy::core_pipeline::clear_color` to `bevy::render::camera`. - `ViewDepthTexture` must now be created via the `new()` method --------- Co-authored-by: vero <email@atlasdostal.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
75 lines
2.5 KiB
Rust
75 lines
2.5 KiB
Rust
use bevy_core_pipeline::prepass::ViewPrepassTextures;
|
|
use bevy_render::render_resource::{
|
|
binding_types::{
|
|
texture_2d, texture_2d_multisampled, texture_depth_2d, texture_depth_2d_multisampled,
|
|
},
|
|
BindGroupLayoutEntryBuilder, TextureAspect, TextureSampleType, TextureView,
|
|
TextureViewDescriptor,
|
|
};
|
|
use bevy_utils::default;
|
|
|
|
use crate::MeshPipelineViewLayoutKey;
|
|
|
|
pub fn get_bind_group_layout_entries(
|
|
layout_key: MeshPipelineViewLayoutKey,
|
|
) -> [Option<BindGroupLayoutEntryBuilder>; 4] {
|
|
let mut entries: [Option<BindGroupLayoutEntryBuilder>; 4] = [None; 4];
|
|
|
|
let multisampled = layout_key.contains(MeshPipelineViewLayoutKey::MULTISAMPLED);
|
|
|
|
if layout_key.contains(MeshPipelineViewLayoutKey::DEPTH_PREPASS) {
|
|
// Depth texture
|
|
entries[0] = if multisampled {
|
|
Some(texture_depth_2d_multisampled())
|
|
} else {
|
|
Some(texture_depth_2d())
|
|
};
|
|
}
|
|
|
|
if layout_key.contains(MeshPipelineViewLayoutKey::NORMAL_PREPASS) {
|
|
// Normal texture
|
|
entries[1] = if multisampled {
|
|
Some(texture_2d_multisampled(TextureSampleType::Float {
|
|
filterable: false,
|
|
}))
|
|
} else {
|
|
Some(texture_2d(TextureSampleType::Float { filterable: false }))
|
|
};
|
|
}
|
|
|
|
if layout_key.contains(MeshPipelineViewLayoutKey::MOTION_VECTOR_PREPASS) {
|
|
// Motion Vectors texture
|
|
entries[2] = if multisampled {
|
|
Some(texture_2d_multisampled(TextureSampleType::Float {
|
|
filterable: false,
|
|
}))
|
|
} else {
|
|
Some(texture_2d(TextureSampleType::Float { filterable: false }))
|
|
};
|
|
}
|
|
|
|
if layout_key.contains(MeshPipelineViewLayoutKey::DEFERRED_PREPASS) {
|
|
// Deferred texture
|
|
entries[3] = Some(texture_2d(TextureSampleType::Uint));
|
|
}
|
|
|
|
entries
|
|
}
|
|
|
|
pub fn get_bindings(prepass_textures: Option<&ViewPrepassTextures>) -> [Option<TextureView>; 4] {
|
|
let depth_desc = TextureViewDescriptor {
|
|
label: Some("prepass_depth"),
|
|
aspect: TextureAspect::DepthOnly,
|
|
..default()
|
|
};
|
|
let depth_view = prepass_textures
|
|
.and_then(|x| x.depth.as_ref())
|
|
.map(|texture| texture.texture.texture.create_view(&depth_desc));
|
|
|
|
[
|
|
depth_view,
|
|
prepass_textures.and_then(|pt| pt.normal_view().cloned()),
|
|
prepass_textures.and_then(|pt| pt.motion_vectors_view().cloned()),
|
|
prepass_textures.and_then(|pt| pt.deferred_view().cloned()),
|
|
]
|
|
}
|