Skip to content

Commit 5890c24

Browse files
committed
Allow specifying view target format in cameras
1 parent dfb809c commit 5890c24

File tree

42 files changed

+344
-308
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+344
-308
lines changed

crates/bevy_anti_alias/src/contrast_adaptive_sharpening/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use bevy_core_pipeline::{
77
FullscreenShader,
88
};
99
use bevy_ecs::{prelude::*, query::QueryItem};
10-
use bevy_image::BevyDefault as _;
1110
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
1211
use bevy_render::{
1312
extract_component::{ExtractComponent, ExtractComponentPlugin, UniformComponentPlugin},
@@ -17,7 +16,7 @@ use bevy_render::{
1716
*,
1817
},
1918
renderer::RenderDevice,
20-
view::{ExtractedView, ViewTarget},
19+
view::ExtractedView,
2120
Render, RenderApp, RenderStartup, RenderSystems,
2221
};
2322
use bevy_shader::Shader;
@@ -249,11 +248,7 @@ fn prepare_cas_pipelines(
249248
&sharpening_pipeline,
250249
CasPipelineKey {
251250
denoise: denoise_cas.0,
252-
texture_format: if view.hdr {
253-
ViewTarget::TEXTURE_FORMAT_HDR
254-
} else {
255-
TextureFormat::bevy_default()
256-
},
251+
texture_format: view.target_format,
257252
},
258253
);
259254

crates/bevy_anti_alias/src/fxaa/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use bevy_core_pipeline::{
77
FullscreenShader,
88
};
99
use bevy_ecs::prelude::*;
10-
use bevy_image::BevyDefault as _;
1110
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
1211
use bevy_render::{
1312
extract_component::{ExtractComponent, ExtractComponentPlugin},
@@ -17,7 +16,7 @@ use bevy_render::{
1716
*,
1817
},
1918
renderer::RenderDevice,
20-
view::{ExtractedView, ViewTarget},
19+
view::ExtractedView,
2120
Render, RenderApp, RenderStartup, RenderSystems,
2221
};
2322
use bevy_shader::Shader;
@@ -216,11 +215,7 @@ pub fn prepare_fxaa_pipelines(
216215
FxaaPipelineKey {
217216
edge_threshold: fxaa.edge_threshold,
218217
edge_threshold_min: fxaa.edge_threshold_min,
219-
texture_format: if view.hdr {
220-
ViewTarget::TEXTURE_FORMAT_HDR
221-
} else {
222-
TextureFormat::bevy_default()
223-
},
218+
texture_format: view.target_format,
224219
},
225220
);
226221

crates/bevy_anti_alias/src/smaa/mod.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use bevy_ecs::{
4848
system::{lifetimeless::Read, Commands, Query, Res, ResMut},
4949
world::World,
5050
};
51-
use bevy_image::{BevyDefault, Image, ToExtents};
51+
use bevy_image::{Image, ToExtents};
5252
use bevy_math::{vec4, Vec4};
5353
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
5454
use bevy_render::{
@@ -605,11 +605,7 @@ fn prepare_smaa_pipelines(
605605
&pipeline_cache,
606606
&smaa_pipelines.neighborhood_blending,
607607
SmaaNeighborhoodBlendingPipelineKey {
608-
texture_format: if view.hdr {
609-
ViewTarget::TEXTURE_FORMAT_HDR
610-
} else {
611-
TextureFormat::bevy_default()
612-
},
608+
texture_format: view.target_format,
613609
preset: smaa.preset,
614610
},
615611
);

crates/bevy_anti_alias/src/taa/mod.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use bevy_ecs::{
1515
system::{Commands, Query, Res, ResMut},
1616
world::World,
1717
};
18-
use bevy_image::{BevyDefault as _, ToExtents};
18+
use bevy_image::ToExtents;
1919
use bevy_math::vec2;
2020
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
2121
use bevy_render::{
@@ -295,6 +295,7 @@ fn init_taa_pipeline(
295295
#[derive(PartialEq, Eq, Hash, Clone)]
296296
struct TaaPipelineKey {
297297
hdr: bool,
298+
target_format: TextureFormat,
298299
reset: bool,
299300
}
300301

@@ -304,17 +305,16 @@ impl SpecializedRenderPipeline for TaaPipeline {
304305
fn specialize(&self, key: Self::Key) -> RenderPipelineDescriptor {
305306
let mut shader_defs = vec![];
306307

307-
let format = if key.hdr {
308+
if key.hdr {
308309
shader_defs.push("TONEMAP".into());
309-
ViewTarget::TEXTURE_FORMAT_HDR
310-
} else {
311-
TextureFormat::bevy_default()
312310
};
313311

314312
if key.reset {
315313
shader_defs.push("RESET".into());
316314
}
317315

316+
let format = key.target_format;
317+
318318
RenderPipelineDescriptor {
319319
label: Some("taa_pipeline".into()),
320320
layout: vec![self.taa_bind_group_layout.clone()],
@@ -417,11 +417,7 @@ fn prepare_taa_history_textures(
417417
mip_level_count: 1,
418418
sample_count: 1,
419419
dimension: TextureDimension::D2,
420-
format: if view.hdr {
421-
ViewTarget::TEXTURE_FORMAT_HDR
422-
} else {
423-
TextureFormat::bevy_default()
424-
},
420+
format: view.target_format,
425421
usage: TextureUsages::TEXTURE_BINDING | TextureUsages::RENDER_ATTACHMENT,
426422
view_formats: &[],
427423
};
@@ -462,6 +458,7 @@ fn prepare_taa_pipelines(
462458
for (entity, view, taa_settings) in &views {
463459
let mut pipeline_key = TaaPipelineKey {
464460
hdr: view.hdr,
461+
target_format: view.target_format,
465462
reset: taa_settings.reset,
466463
};
467464
let pipeline_id = pipelines.specialize(&pipeline_cache, &pipeline, pipeline_key.clone());

crates/bevy_camera/src/camera.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ use super::{
77
use bevy_asset::Handle;
88
use bevy_derive::Deref;
99
use bevy_ecs::{component::Component, entity::Entity, reflect::ReflectComponent};
10-
use bevy_image::Image;
10+
use bevy_image::{BevyDefault, Image};
1111
use bevy_math::{ops, Dir3, FloatOrd, Mat4, Ray3d, Rect, URect, UVec2, Vec2, Vec3, Vec3A};
1212
use bevy_reflect::prelude::*;
1313
use bevy_transform::components::{GlobalTransform, Transform};
1414
use bevy_window::{NormalizedWindowRef, WindowRef};
1515
use core::ops::Range;
1616
use derive_more::derive::From;
1717
use thiserror::Error;
18-
use wgpu_types::{BlendState, TextureUsages};
18+
use wgpu_types::{BlendState, TextureFormat, TextureUsages};
1919

2020
/// Render viewport configuration for the [`Camera`] component.
2121
///
@@ -345,6 +345,7 @@ pub enum ViewportConversionError {
345345
#[require(
346346
Frustum,
347347
CameraMainTextureUsages,
348+
CameraMainTextureFormat,
348349
VisibleEntities,
349350
Transform,
350351
Visibility
@@ -949,7 +950,6 @@ impl Default for RenderTarget {
949950

950951
/// This component lets you control the [`TextureUsages`] field of the main texture generated for the camera
951952
#[derive(Component, Clone, Copy, Reflect)]
952-
#[reflect(opaque)]
953953
#[reflect(Component, Default, Clone)]
954954
pub struct CameraMainTextureUsages(pub TextureUsages);
955955

@@ -970,6 +970,25 @@ impl CameraMainTextureUsages {
970970
}
971971
}
972972

973+
/// This component lets you control the [`TextureFormat`] field of the main texture generated for the camera
974+
///
975+
/// By default, bevy will use [`TextureFormat::Rgba8UnormSrgb`] for sdr and [`TextureFormat::Rgba16Float`] for hdr.
976+
#[derive(Component, Clone, Copy, Reflect)]
977+
#[reflect(Component, Default, Clone)]
978+
pub struct CameraMainTextureFormat {
979+
pub sdr_format: TextureFormat,
980+
pub hdr_format: TextureFormat,
981+
}
982+
983+
impl Default for CameraMainTextureFormat {
984+
fn default() -> Self {
985+
Self {
986+
sdr_format: TextureFormat::bevy_default(),
987+
hdr_format: TextureFormat::Rgba16Float,
988+
}
989+
}
990+
}
991+
973992
#[cfg(test)]
974993
mod test {
975994
use bevy_math::{Vec2, Vec3};

crates/bevy_core_pipeline/src/core_3d/mod.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ use bevy_app::{App, Plugin, PostUpdate};
8888
use bevy_asset::UntypedAssetId;
8989
use bevy_color::LinearRgba;
9090
use bevy_ecs::prelude::*;
91-
use bevy_image::{BevyDefault, ToExtents};
91+
use bevy_image::ToExtents;
9292
use bevy_math::FloatOrd;
9393
use bevy_platform::collections::{HashMap, HashSet};
9494
use bevy_render::{
@@ -108,7 +108,7 @@ use bevy_render::{
108108
renderer::RenderDevice,
109109
sync_world::{MainEntity, RenderEntity},
110110
texture::{ColorAttachment, TextureCache},
111-
view::{ExtractedView, ViewDepthTexture, ViewTarget},
111+
view::{ExtractedView, ViewDepthTexture},
112112
Extract, ExtractSchedule, Render, RenderApp, RenderSystems,
113113
};
114114
use nonmax::NonMaxU32;
@@ -897,11 +897,7 @@ pub fn prepare_core_3d_transmission_textures(
897897
.or_insert_with(|| {
898898
let usage = TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST;
899899

900-
let format = if view.hdr {
901-
ViewTarget::TEXTURE_FORMAT_HDR
902-
} else {
903-
TextureFormat::bevy_default()
904-
};
900+
let format = view.target_format;
905901

906902
let descriptor = TextureDescriptor {
907903
label: Some("view_transmission_texture"),

crates/bevy_core_pipeline/src/oit/resolve/mod.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use bevy_ecs::{
77
entity::{EntityHashMap, EntityHashSet},
88
prelude::*,
99
};
10-
use bevy_image::BevyDefault as _;
1110
use bevy_render::{
1211
render_resource::{
1312
binding_types::{storage_buffer_sized, texture_depth_2d, uniform_buffer},
@@ -16,7 +15,7 @@ use bevy_render::{
1615
FragmentState, PipelineCache, RenderPipelineDescriptor, ShaderStages, TextureFormat,
1716
},
1817
renderer::{RenderAdapter, RenderDevice},
19-
view::{ExtractedView, ViewTarget, ViewUniform, ViewUniforms},
18+
view::{ExtractedView, ViewUniform, ViewUniforms},
2019
Render, RenderApp, RenderSystems,
2120
};
2221
use bevy_shader::ShaderDefVal;
@@ -137,7 +136,7 @@ pub struct OitResolvePipelineId(pub CachedRenderPipelineId);
137136
/// This key is used to cache the pipeline id and to specialize the render pipeline descriptor.
138137
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
139138
pub struct OitResolvePipelineKey {
140-
hdr: bool,
139+
target_format: TextureFormat,
141140
layer_count: i32,
142141
}
143142

@@ -163,7 +162,7 @@ pub fn queue_oit_resolve_pipeline(
163162
for (e, view, oit_settings) in &views {
164163
current_view_entities.insert(e);
165164
let key = OitResolvePipelineKey {
166-
hdr: view.hdr,
165+
target_format: view.target_format,
167166
layer_count: oit_settings.layer_count,
168167
};
169168

@@ -200,11 +199,7 @@ fn specialize_oit_resolve_pipeline(
200199
fullscreen_shader: &FullscreenShader,
201200
asset_server: &AssetServer,
202201
) -> RenderPipelineDescriptor {
203-
let format = if key.hdr {
204-
ViewTarget::TEXTURE_FORMAT_HDR
205-
} else {
206-
TextureFormat::bevy_default()
207-
};
202+
let format = key.target_format;
208203

209204
RenderPipelineDescriptor {
210205
label: Some("oit_resolve_pipeline".into()),

crates/bevy_core_pipeline/src/skybox/mod.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use bevy_ecs::{
99
schedule::IntoScheduleConfigs,
1010
system::{Commands, Query, Res, ResMut},
1111
};
12-
use bevy_image::{BevyDefault, Image};
12+
use bevy_image::Image;
1313
use bevy_math::{Mat4, Quat};
1414
use bevy_reflect::{std_traits::ReflectDefault, Reflect};
1515
use bevy_render::{
@@ -24,7 +24,7 @@ use bevy_render::{
2424
},
2525
renderer::RenderDevice,
2626
texture::GpuImage,
27-
view::{ExtractedView, Msaa, ViewTarget, ViewUniform, ViewUniforms},
27+
view::{ExtractedView, Msaa, ViewUniform, ViewUniforms},
2828
Render, RenderApp, RenderStartup, RenderSystems,
2929
};
3030
use bevy_shader::Shader;
@@ -185,7 +185,7 @@ fn init_skybox_pipeline(
185185

186186
#[derive(PartialEq, Eq, Hash, Clone, Copy)]
187187
struct SkyboxPipelineKey {
188-
hdr: bool,
188+
target_format: TextureFormat,
189189
samples: u32,
190190
depth_format: TextureFormat,
191191
}
@@ -225,11 +225,7 @@ impl SpecializedRenderPipeline for SkyboxPipeline {
225225
fragment: Some(FragmentState {
226226
shader: self.shader.clone(),
227227
targets: vec![Some(ColorTargetState {
228-
format: if key.hdr {
229-
ViewTarget::TEXTURE_FORMAT_HDR
230-
} else {
231-
TextureFormat::bevy_default()
232-
},
228+
format: key.target_format,
233229
// BlendState::REPLACE is not needed here, and None will be potentially much faster in some cases.
234230
blend: None,
235231
write_mask: ColorWrites::ALL,
@@ -256,7 +252,7 @@ fn prepare_skybox_pipelines(
256252
&pipeline_cache,
257253
&pipeline,
258254
SkyboxPipelineKey {
259-
hdr: view.hdr,
255+
target_format: view.target_format,
260256
samples: msaa.samples(),
261257
depth_format: CORE_3D_DEPTH_FORMAT,
262258
},

crates/bevy_core_pipeline/src/tonemapping/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ bitflags! {
186186

187187
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
188188
pub struct TonemappingPipelineKey {
189+
target_format: TextureFormat,
189190
deband_dither: DebandDither,
190191
tonemapping: Tonemapping,
191192
flags: TonemappingPipelineKeyFlags,
@@ -273,7 +274,7 @@ impl SpecializedRenderPipeline for TonemappingPipeline {
273274
shader: self.fragment_shader.clone(),
274275
shader_defs,
275276
targets: vec![Some(ColorTargetState {
276-
format: ViewTarget::TEXTURE_FORMAT_HDR,
277+
format: key.target_format,
277278
blend: None,
278279
write_mask: ColorWrites::ALL,
279280
})],
@@ -357,6 +358,7 @@ pub fn prepare_view_tonemapping_pipelines(
357358
deband_dither: *dither.unwrap_or(&DebandDither::Disabled),
358359
tonemapping: *tonemapping.unwrap_or(&Tonemapping::None),
359360
flags,
361+
target_format: view.target_format,
360362
};
361363
let pipeline = pipelines.specialize(&pipeline_cache, &upscaling_pipeline, key);
362364

0 commit comments

Comments
 (0)