Skip to content

Commit 5912d95

Browse files
committed
shorten internal name to CAS, fix wrong uniforms with multiple cameras using CAS
1 parent 761a454 commit 5912d95

File tree

3 files changed

+41
-47
lines changed

3 files changed

+41
-47
lines changed

crates/bevy_core_pipeline/src/contrast_adaptive_sharpening/mod.rs

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ use bevy_render::{
1616

1717
mod node;
1818

19-
pub use node::ContrastAdaptiveSharpeningNode;
19+
pub use node::CASNode;
2020

2121
/// Applies a contrast adaptive sharpening (CAS) filter to the camera.
2222
///
2323
/// CAS is usually used in combination with shader based anti-aliasing methods
2424
/// such as FXAA or TAA to regain some of the lost detail from the blurring that they introduce.
2525
///
2626
/// CAS is designed to adjust the amount of sharpening applied to different areas of an image
27-
/// based on the local contrast.This can help avoid over-sharpening areas with high contrast
27+
/// based on the local contrast. This can help avoid over-sharpening areas with high contrast
2828
/// and under-sharpening areas with low contrast.
2929
///
3030
/// To use this, add the [`ContrastAdaptiveSharpeningSettings`] component to a 2D or 3D camera.
@@ -82,9 +82,9 @@ const CONTRAST_ADAPTIVE_SHARPENING_SHADER_HANDLE: HandleUntyped =
8282
HandleUntyped::weak_from_u64(Shader::TYPE_UUID, 6925381244141981602);
8383

8484
/// Adds Support for Contrast Adaptive Sharpening (CAS).
85-
pub struct ContrastAdaptiveSharpeningPlugin;
85+
pub struct CASPlugin;
8686

87-
impl Plugin for ContrastAdaptiveSharpeningPlugin {
87+
impl Plugin for CASPlugin {
8888
fn build(&self, app: &mut App) {
8989
load_internal_asset!(
9090
app,
@@ -102,14 +102,11 @@ impl Plugin for ContrastAdaptiveSharpeningPlugin {
102102
Err(_) => return,
103103
};
104104
render_app
105-
.init_resource::<ContrastAdaptiveSharpeningPipeline>()
106-
.init_resource::<SpecializedRenderPipelines<ContrastAdaptiveSharpeningPipeline>>()
107-
.add_system_to_stage(
108-
RenderStage::Prepare,
109-
prepare_contrast_adaptive_sharpening_pipelines,
110-
);
105+
.init_resource::<CASPipeline>()
106+
.init_resource::<SpecializedRenderPipelines<CASPipeline>>()
107+
.add_system_to_stage(RenderStage::Prepare, prepare_cas_pipelines);
111108
{
112-
let cas_node = ContrastAdaptiveSharpeningNode::new(&mut render_app.world);
109+
let cas_node = CASNode::new(&mut render_app.world);
113110
let mut binding = render_app.world.resource_mut::<RenderGraph>();
114111
let graph = binding.get_sub_graph_mut(core_3d::graph::NAME).unwrap();
115112

@@ -119,7 +116,7 @@ impl Plugin for ContrastAdaptiveSharpeningPlugin {
119116
graph.input_node().id,
120117
core_3d::graph::input::VIEW_ENTITY,
121118
core_3d::graph::node::CONTRAST_ADAPTIVE_SHARPENING,
122-
ContrastAdaptiveSharpeningNode::IN_VIEW,
119+
CASNode::IN_VIEW,
123120
);
124121

125122
graph.add_node_edge(
@@ -132,7 +129,7 @@ impl Plugin for ContrastAdaptiveSharpeningPlugin {
132129
);
133130
}
134131
{
135-
let cas_node = ContrastAdaptiveSharpeningNode::new(&mut render_app.world);
132+
let cas_node = CASNode::new(&mut render_app.world);
136133
let mut binding = render_app.world.resource_mut::<RenderGraph>();
137134
let graph = binding.get_sub_graph_mut(core_2d::graph::NAME).unwrap();
138135

@@ -142,7 +139,7 @@ impl Plugin for ContrastAdaptiveSharpeningPlugin {
142139
graph.input_node().id,
143140
core_2d::graph::input::VIEW_ENTITY,
144141
core_2d::graph::node::CONTRAST_ADAPTIVE_SHARPENING,
145-
ContrastAdaptiveSharpeningNode::IN_VIEW,
142+
CASNode::IN_VIEW,
146143
);
147144

148145
graph.add_node_edge(
@@ -158,12 +155,12 @@ impl Plugin for ContrastAdaptiveSharpeningPlugin {
158155
}
159156

160157
#[derive(Resource)]
161-
pub struct ContrastAdaptiveSharpeningPipeline {
158+
pub struct CASPipeline {
162159
texture_bind_group: BindGroupLayout,
163160
sampler: Sampler,
164161
}
165162

166-
impl FromWorld for ContrastAdaptiveSharpeningPipeline {
163+
impl FromWorld for CASPipeline {
167164
fn from_world(render_world: &mut World) -> Self {
168165
let render_device = render_world.resource::<RenderDevice>();
169166
let texture_bind_group =
@@ -191,7 +188,7 @@ impl FromWorld for ContrastAdaptiveSharpeningPipeline {
191188
binding: 2,
192189
ty: BindingType::Buffer {
193190
ty: BufferBindingType::Uniform,
194-
has_dynamic_offset: false,
191+
has_dynamic_offset: true,
195192
min_binding_size: Some(CASUniform::min_size()),
196193
},
197194
visibility: ShaderStages::FRAGMENT,
@@ -202,20 +199,20 @@ impl FromWorld for ContrastAdaptiveSharpeningPipeline {
202199

203200
let sampler = render_device.create_sampler(&SamplerDescriptor::default());
204201

205-
ContrastAdaptiveSharpeningPipeline {
202+
CASPipeline {
206203
texture_bind_group,
207204
sampler,
208205
}
209206
}
210207
}
211208

212209
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
213-
pub struct SharpeningPipelineKey {
210+
pub struct CASPipelineKey {
214211
texture_format: TextureFormat,
215212
}
216213

217-
impl SpecializedRenderPipeline for ContrastAdaptiveSharpeningPipeline {
218-
type Key = SharpeningPipelineKey;
214+
impl SpecializedRenderPipeline for CASPipeline {
215+
type Key = CASPipelineKey;
219216

220217
fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor {
221218
RenderPipelineDescriptor {
@@ -239,11 +236,11 @@ impl SpecializedRenderPipeline for ContrastAdaptiveSharpeningPipeline {
239236
}
240237
}
241238

242-
pub fn prepare_contrast_adaptive_sharpening_pipelines(
239+
pub fn prepare_cas_pipelines(
243240
mut commands: Commands,
244241
pipeline_cache: Res<PipelineCache>,
245-
mut pipelines: ResMut<SpecializedRenderPipelines<ContrastAdaptiveSharpeningPipeline>>,
246-
sharpening_pipeline: Res<ContrastAdaptiveSharpeningPipeline>,
242+
mut pipelines: ResMut<SpecializedRenderPipelines<CASPipeline>>,
243+
sharpening_pipeline: Res<CASPipeline>,
247244
views: Query<(Entity, &ExtractedView, &CASUniform)>,
248245
) {
249246
for (entity, view, sharpening) in &views {
@@ -253,7 +250,7 @@ pub fn prepare_contrast_adaptive_sharpening_pipelines(
253250
let pipeline_id = pipelines.specialize(
254251
&pipeline_cache,
255252
&sharpening_pipeline,
256-
SharpeningPipelineKey {
253+
CASPipelineKey {
257254
texture_format: if view.hdr {
258255
ViewTarget::TEXTURE_FORMAT_HDR
259256
} else {
@@ -262,11 +259,9 @@ pub fn prepare_contrast_adaptive_sharpening_pipelines(
262259
},
263260
);
264261

265-
commands
266-
.entity(entity)
267-
.insert(ViewContrastAdaptiveSharpeningPipeline(pipeline_id));
262+
commands.entity(entity).insert(ViewCASPipeline(pipeline_id));
268263
}
269264
}
270265

271266
#[derive(Component)]
272-
pub struct ViewContrastAdaptiveSharpeningPipeline(CachedRenderPipelineId);
267+
pub struct ViewCASPipeline(CachedRenderPipelineId);

crates/bevy_core_pipeline/src/contrast_adaptive_sharpening/node.rs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use std::sync::Mutex;
22

3-
use crate::contrast_adaptive_sharpening::ViewContrastAdaptiveSharpeningPipeline;
3+
use crate::contrast_adaptive_sharpening::ViewCASPipeline;
44
use bevy_ecs::prelude::*;
55
use bevy_ecs::query::QueryState;
66
use bevy_render::{
7-
extract_component::ComponentUniforms,
7+
extract_component::{ComponentUniforms, DynamicUniformIndex},
88
render_graph::{Node, NodeRunError, RenderGraphContext, SlotInfo, SlotType},
99
render_resource::{
1010
BindGroup, BindGroupDescriptor, BindGroupEntry, BindingResource, Operations, PipelineCache,
@@ -14,21 +14,21 @@ use bevy_render::{
1414
view::{ExtractedView, ViewTarget},
1515
};
1616

17-
use super::{CASUniform, ContrastAdaptiveSharpeningPipeline};
17+
use super::{CASPipeline, CASUniform};
1818

19-
pub struct ContrastAdaptiveSharpeningNode {
19+
pub struct CASNode {
2020
query: QueryState<
2121
(
2222
&'static ViewTarget,
23-
&'static ViewContrastAdaptiveSharpeningPipeline,
24-
// &'static CASUniform,
23+
&'static ViewCASPipeline,
24+
&'static DynamicUniformIndex<CASUniform>,
2525
),
2626
With<ExtractedView>,
2727
>,
2828
cached_texture_bind_group: Mutex<Option<(TextureViewId, BindGroup)>>,
2929
}
3030

31-
impl ContrastAdaptiveSharpeningNode {
31+
impl CASNode {
3232
pub const IN_VIEW: &'static str = "view";
3333

3434
pub fn new(world: &mut World) -> Self {
@@ -39,12 +39,9 @@ impl ContrastAdaptiveSharpeningNode {
3939
}
4040
}
4141

42-
impl Node for ContrastAdaptiveSharpeningNode {
42+
impl Node for CASNode {
4343
fn input(&self) -> Vec<SlotInfo> {
44-
vec![SlotInfo::new(
45-
ContrastAdaptiveSharpeningNode::IN_VIEW,
46-
SlotType::Entity,
47-
)]
44+
vec![SlotInfo::new(CASNode::IN_VIEW, SlotType::Entity)]
4845
}
4946

5047
fn update(&mut self, world: &mut World) {
@@ -59,10 +56,12 @@ impl Node for ContrastAdaptiveSharpeningNode {
5956
) -> Result<(), NodeRunError> {
6057
let view_entity = graph.get_input_entity(Self::IN_VIEW)?;
6158
let pipeline_cache = world.resource::<PipelineCache>();
62-
let sharpening_pipeline = world.resource::<ContrastAdaptiveSharpeningPipeline>();
59+
let sharpening_pipeline = world.resource::<CASPipeline>();
6360
let uniforms = world.resource::<ComponentUniforms<CASUniform>>();
6461

65-
let Ok((target, pipeline)) = self.query.get_manual(world, view_entity) else { return Ok(()) };
62+
let Ok((target, pipeline, uniform_index)) = self.query.get_manual(world, view_entity) else { return Ok(()) };
63+
64+
let Some(uniforms) = uniforms.binding() else { return Ok(()) };
6665

6766
let pipeline = pipeline_cache.get_render_pipeline(pipeline.0).unwrap();
6867

@@ -93,7 +92,7 @@ impl Node for ContrastAdaptiveSharpeningNode {
9392
},
9493
BindGroupEntry {
9594
binding: 2,
96-
resource: uniforms.binding().unwrap(),
95+
resource: uniforms,
9796
},
9897
],
9998
});
@@ -118,7 +117,7 @@ impl Node for ContrastAdaptiveSharpeningNode {
118117
.begin_render_pass(&pass_descriptor);
119118

120119
render_pass.set_pipeline(pipeline);
121-
render_pass.set_bind_group(0, bind_group, &[]);
120+
render_pass.set_bind_group(0, bind_group, &[uniform_index.index()]);
122121
render_pass.draw(0..3, 0..1);
123122

124123
Ok(())

crates/bevy_core_pipeline/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub mod prelude {
2121
use crate::{
2222
bloom::BloomPlugin,
2323
clear_color::{ClearColor, ClearColorConfig},
24-
contrast_adaptive_sharpening::ContrastAdaptiveSharpeningPlugin,
24+
contrast_adaptive_sharpening::CASPlugin,
2525
core_2d::Core2dPlugin,
2626
core_3d::Core3dPlugin,
2727
fullscreen_vertex_shader::FULLSCREEN_SHADER_HANDLE,
@@ -58,6 +58,6 @@ impl Plugin for CorePipelinePlugin {
5858
.add_plugin(UpscalingPlugin)
5959
.add_plugin(BloomPlugin)
6060
.add_plugin(FxaaPlugin)
61-
.add_plugin(ContrastAdaptiveSharpeningPlugin);
61+
.add_plugin(CASPlugin);
6262
}
6363
}

0 commit comments

Comments
 (0)