Skip to content

Commit 98bbdc8

Browse files
committed
ability to disable bloom + configurable bloom threshold
1 parent 635b8b9 commit 98bbdc8

File tree

6 files changed

+119
-85
lines changed

6 files changed

+119
-85
lines changed

editor/src/plugins/settings.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@
2222
2323
use crate::{
2424
fyrox::{
25-
core::{log::Log, parking_lot::lock_api::Mutex, pool::Handle, some_or_return},
25+
asset::manager::ResourceManager,
26+
core::{
27+
log::Log, parking_lot::lock_api::Mutex, pool::Handle, reflect::Reflect, some_or_return,
28+
},
2629
engine::Engine,
2730
graph::{BaseSceneGraph, SceneGraph},
2831
gui::{
@@ -36,7 +39,8 @@ use crate::{
3639
inspectable::InspectablePropertyEditorDefinition,
3740
key::HotKeyPropertyEditorDefinition, PropertyEditorDefinitionContainer,
3841
},
39-
Inspector, InspectorBuilder, InspectorContext, InspectorMessage, PropertyAction,
42+
Inspector, InspectorBuilder, InspectorContext, InspectorContextArgs,
43+
InspectorMessage, PropertyAction,
4044
},
4145
menu::MenuItemMessage,
4246
message::UiMessage,
@@ -48,6 +52,7 @@ use crate::{
4852
HorizontalAlignment, Orientation, Thickness, UiNode, UserInterface,
4953
},
5054
renderer::QualitySettings,
55+
renderer::{BloomSettings, CsmSettings, ShadowMapPrecision},
5156
},
5257
menu::create_menu_item,
5358
message::MessageSender,
@@ -68,10 +73,6 @@ use crate::{
6873
},
6974
Editor, MSG_SYNC_FLAG,
7075
};
71-
use fyrox::asset::manager::ResourceManager;
72-
use fyrox::core::reflect::Reflect;
73-
use fyrox::gui::inspector::InspectorContextArgs;
74-
use fyrox::renderer::{CsmSettings, ShadowMapPrecision};
7576
use fyrox_build_tools::{BuildProfile, CommandDescriptor, EnvironmentVariable};
7677
use rust_fuzzy_search::fuzzy_compare;
7778
use std::sync::Arc;
@@ -106,6 +107,7 @@ fn make_property_editors_container(
106107
container.insert(InspectablePropertyEditorDefinition::<KeyBindings>::new());
107108
container.insert(InspectablePropertyEditorDefinition::<TerrainKeyBindings>::new());
108109
container.insert(InspectablePropertyEditorDefinition::<BuildSettings>::new());
110+
container.insert(InspectablePropertyEditorDefinition::<BloomSettings>::new());
109111
container.insert(VecCollectionPropertyEditorDefinition::<EnvironmentVariable>::new());
110112
container.insert(InspectablePropertyEditorDefinition::<EnvironmentVariable>::new());
111113
container.insert(VecCollectionPropertyEditorDefinition::<BuildProfile>::new());

fyrox-impl/src/renderer/bloom/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1919
// SOFTWARE.
2020

21+
use crate::renderer::QualitySettings;
2122
use crate::{
2223
core::{math::Rect, ImmutableString},
2324
graphics::{
@@ -82,13 +83,17 @@ impl BloomRenderer {
8283
hdr_scene_frame: &GpuTexture,
8384
uniform_buffer_cache: &mut UniformBufferCache,
8485
renderer_resources: &RendererResources,
86+
settings: &QualitySettings,
8587
) -> Result<RenderPassStatistics, FrameworkError> {
8688
let mut stats = RenderPassStatistics::default();
8789

8890
let viewport = Rect::new(0, 0, self.width as i32, self.height as i32);
8991

9092
let wvp = make_viewport_matrix(viewport);
91-
let properties = PropertyGroup::from([property("worldViewProjection", &wvp)]);
93+
let properties = PropertyGroup::from([
94+
property("worldViewProjection", &wvp),
95+
property("threshold", &settings.bloom_settings.threshold),
96+
]);
9297
let material = RenderMaterial::from([
9398
binding(
9499
"hdrSampler",

fyrox-impl/src/renderer/hdr/mod.rs

Lines changed: 51 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ use crate::{
2828
},
2929
graphics::{
3030
error::FrameworkError,
31-
framebuffer::ReadTarget,
32-
framebuffer::{Attachment, DrawCallStatistics, GpuFrameBuffer},
31+
framebuffer::{Attachment, DrawCallStatistics, GpuFrameBuffer, ReadTarget},
3332
gpu_texture::{GpuTexture, GpuTextureDescriptor, GpuTextureKind, PixelKind},
3433
server::GraphicsServer,
3534
},
@@ -42,7 +41,7 @@ use crate::{
4241
hdr::{adaptation::AdaptationChain, luminance::luminance_evaluator::LuminanceEvaluator},
4342
make_viewport_matrix,
4443
resources::RendererResources,
45-
RenderPassStatistics,
44+
QualitySettings, RenderPassStatistics,
4645
},
4746
scene::camera::{ColorGradingLut, Exposure},
4847
};
@@ -97,6 +96,23 @@ pub struct HighDynamicRangeRenderer {
9796
lum_calculation_method: LuminanceCalculationMethod,
9897
}
9998

99+
pub struct HdrRendererArgs<'a> {
100+
pub server: &'a dyn GraphicsServer,
101+
pub hdr_scene_frame: &'a GpuTexture,
102+
pub bloom_texture: &'a GpuTexture,
103+
pub ldr_framebuffer: &'a GpuFrameBuffer,
104+
pub viewport: Rect<i32>,
105+
pub dt: f32,
106+
pub exposure: Exposure,
107+
pub color_grading_lut: Option<&'a ColorGradingLut>,
108+
pub use_color_grading: bool,
109+
pub texture_cache: &'a mut TextureCache,
110+
pub uniform_buffer_cache: &'a mut UniformBufferCache,
111+
pub renderer_resources: &'a RendererResources,
112+
pub resource_manager: &'a ResourceManager,
113+
pub settings: &'a QualitySettings,
114+
}
115+
100116
impl HighDynamicRangeRenderer {
101117
pub fn new(server: &dyn GraphicsServer) -> Result<Self, FrameworkError> {
102118
Ok(Self {
@@ -285,21 +301,24 @@ impl HighDynamicRangeRenderer {
285301
)
286302
}
287303

288-
fn map_hdr_to_ldr(
289-
&self,
290-
server: &dyn GraphicsServer,
291-
hdr_scene_frame: &GpuTexture,
292-
bloom_texture: &GpuTexture,
293-
ldr_framebuffer: &GpuFrameBuffer,
294-
viewport: Rect<i32>,
295-
exposure: Exposure,
296-
color_grading_lut: Option<&ColorGradingLut>,
297-
use_color_grading: bool,
298-
texture_cache: &mut TextureCache,
299-
uniform_buffer_cache: &mut UniformBufferCache,
300-
renderer_resources: &RendererResources,
301-
resource_manager: &ResourceManager,
302-
) -> Result<DrawCallStatistics, FrameworkError> {
304+
fn map_hdr_to_ldr(&self, args: HdrRendererArgs) -> Result<DrawCallStatistics, FrameworkError> {
305+
let HdrRendererArgs {
306+
server,
307+
hdr_scene_frame,
308+
bloom_texture,
309+
ldr_framebuffer,
310+
viewport,
311+
exposure,
312+
color_grading_lut,
313+
use_color_grading,
314+
texture_cache,
315+
uniform_buffer_cache,
316+
renderer_resources,
317+
resource_manager,
318+
settings,
319+
..
320+
} = args;
321+
303322
let frame_matrix = make_viewport_matrix(viewport);
304323

305324
let color_grading_lut_tex = color_grading_lut
@@ -318,6 +337,12 @@ impl HighDynamicRangeRenderer {
318337
Exposure::Manual(fixed_exposure) => (false, 0.0, 0.0, fixed_exposure),
319338
};
320339

340+
let bloom_texture = if settings.bloom_settings.use_bloom {
341+
bloom_texture
342+
} else {
343+
&renderer_resources.black_dummy
344+
};
345+
321346
let color_grading_enabled = use_color_grading && color_grading_lut.is_some();
322347
let properties = PropertyGroup::from([
323348
property("worldViewProjection", &frame_matrix),
@@ -360,44 +385,17 @@ impl HighDynamicRangeRenderer {
360385
)
361386
}
362387

363-
pub fn render(
364-
&self,
365-
server: &dyn GraphicsServer,
366-
hdr_scene_frame: &GpuTexture,
367-
bloom_texture: &GpuTexture,
368-
ldr_framebuffer: &GpuFrameBuffer,
369-
viewport: Rect<i32>,
370-
dt: f32,
371-
exposure: Exposure,
372-
color_grading_lut: Option<&ColorGradingLut>,
373-
use_color_grading: bool,
374-
texture_cache: &mut TextureCache,
375-
uniform_buffer_cache: &mut UniformBufferCache,
376-
renderer_resources: &RendererResources,
377-
resource_manager: &ResourceManager,
378-
) -> Result<RenderPassStatistics, FrameworkError> {
388+
pub fn render(&self, args: HdrRendererArgs) -> Result<RenderPassStatistics, FrameworkError> {
379389
let mut stats = RenderPassStatistics::default();
380390
stats += self.calculate_frame_luminance(
381-
hdr_scene_frame,
382-
uniform_buffer_cache,
383-
renderer_resources,
384-
)?;
385-
stats += self.calculate_avg_frame_luminance(uniform_buffer_cache, renderer_resources)?;
386-
stats += self.adaptation(dt, uniform_buffer_cache, renderer_resources)?;
387-
stats += self.map_hdr_to_ldr(
388-
server,
389-
hdr_scene_frame,
390-
bloom_texture,
391-
ldr_framebuffer,
392-
viewport,
393-
exposure,
394-
color_grading_lut,
395-
use_color_grading,
396-
texture_cache,
397-
uniform_buffer_cache,
398-
renderer_resources,
399-
resource_manager,
391+
args.hdr_scene_frame,
392+
args.uniform_buffer_cache,
393+
args.renderer_resources,
400394
)?;
395+
stats +=
396+
self.calculate_avg_frame_luminance(args.uniform_buffer_cache, args.renderer_resources)?;
397+
stats += self.adaptation(args.dt, args.uniform_buffer_cache, args.renderer_resources)?;
398+
stats += self.map_hdr_to_ldr(args)?;
401399
Ok(stats)
402400
}
403401
}

fyrox-impl/src/renderer/mod.rs

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ mod settings;
4949
mod shadow;
5050
mod ssao;
5151

52+
use crate::renderer::hdr::HdrRendererArgs;
5253
use crate::{
5354
asset::{event::ResourceEvent, manager::ResourceManager},
5455
core::{
@@ -1138,30 +1139,34 @@ impl Renderer {
11381139
}
11391140

11401141
// Prepare glow map.
1141-
render_data.statistics += render_data.bloom_renderer.render(
1142-
render_data.hdr_scene_frame_texture(),
1143-
&mut self.uniform_buffer_cache,
1144-
&self.renderer_resources,
1145-
)?;
1142+
if self.quality_settings.bloom_settings.use_bloom {
1143+
render_data.statistics += render_data.bloom_renderer.render(
1144+
render_data.hdr_scene_frame_texture(),
1145+
&mut self.uniform_buffer_cache,
1146+
&self.renderer_resources,
1147+
&self.quality_settings,
1148+
)?;
1149+
}
11461150

11471151
// Convert high dynamic range frame to low dynamic range (sRGB) with tone mapping and gamma correction.
11481152
let mut dest_buf = 0;
11491153
let mut src_buf = 1;
1150-
render_data.statistics += render_data.hdr_renderer.render(
1154+
render_data.statistics += render_data.hdr_renderer.render(HdrRendererArgs {
11511155
server,
1152-
render_data.hdr_scene_frame_texture(),
1153-
render_data.bloom_renderer.result(),
1154-
&render_data.ldr_temp_framebuffer[dest_buf],
1155-
observer.viewport,
1156+
hdr_scene_frame: render_data.hdr_scene_frame_texture(),
1157+
bloom_texture: render_data.bloom_renderer.result(),
1158+
ldr_framebuffer: &render_data.ldr_temp_framebuffer[dest_buf],
1159+
viewport: observer.viewport,
11561160
dt,
1157-
observer.exposure,
1158-
observer.color_grading_lut.as_ref(),
1159-
observer.color_grading_enabled,
1160-
&mut self.texture_cache,
1161-
&mut self.uniform_buffer_cache,
1162-
&self.renderer_resources,
1161+
exposure: observer.exposure,
1162+
color_grading_lut: observer.color_grading_lut.as_ref(),
1163+
use_color_grading: observer.color_grading_enabled,
1164+
texture_cache: &mut self.texture_cache,
1165+
uniform_buffer_cache: &mut self.uniform_buffer_cache,
1166+
renderer_resources: &self.renderer_resources,
11631167
resource_manager,
1164-
)?;
1168+
settings: &self.quality_settings,
1169+
})?;
11651170
std::mem::swap(&mut dest_buf, &mut src_buf);
11661171

11671172
// Apply FXAA if needed.

fyrox-impl/src/renderer/settings.rs

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,26 @@ use fyrox_core::uuid_provider;
2323
use serde::{Deserialize, Serialize};
2424
use strum_macros::{AsRefStr, EnumString, VariantNames};
2525

26+
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize, Reflect)]
27+
pub struct BloomSettings {
28+
/// Whether to use bloom effect.
29+
pub use_bloom: bool,
30+
31+
/// A threshold value for luminance of a pixel to be considered "very bright". Only pixels
32+
/// that passed this check (>=) will be included in the bloom render target and will have the glow
33+
/// effect.
34+
pub threshold: f32,
35+
}
36+
37+
impl Default for BloomSettings {
38+
fn default() -> Self {
39+
Self {
40+
use_bloom: true,
41+
threshold: 1.01,
42+
}
43+
}
44+
}
45+
2646
/// Quality settings allows you to find optimal balance between performance and
2747
/// graphics quality.
2848
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize, Reflect)]
@@ -79,9 +99,6 @@ pub struct QualitySettings {
7999
/// Whether to use Parallax Mapping or not.
80100
pub use_parallax_mapping: bool,
81101

82-
/// Whether to use bloom effect.
83-
pub use_bloom: bool,
84-
85102
/// Whether to use occlusion culling for geometry or not. Warning: this is experimental feature
86103
/// that may have bugs and unstable behavior. Disabled by default.
87104
#[serde(default)]
@@ -91,6 +108,9 @@ pub struct QualitySettings {
91108
/// feature that may have bugs and unstable behavior. Disabled by default.
92109
#[serde(default)]
93110
pub use_light_occlusion_culling: bool,
111+
112+
#[serde(default)]
113+
pub bloom_settings: BloomSettings,
94114
}
95115

96116
impl Default for QualitySettings {
@@ -125,7 +145,7 @@ impl QualitySettings {
125145

126146
fxaa: true,
127147

128-
use_bloom: true,
148+
bloom_settings: Default::default(),
129149

130150
use_parallax_mapping: true,
131151

@@ -161,7 +181,7 @@ impl QualitySettings {
161181

162182
fxaa: true,
163183

164-
use_bloom: true,
184+
bloom_settings: Default::default(),
165185

166186
use_parallax_mapping: true,
167187

@@ -202,7 +222,7 @@ impl QualitySettings {
202222

203223
fxaa: true,
204224

205-
use_bloom: true,
225+
bloom_settings: Default::default(),
206226

207227
use_parallax_mapping: false,
208228

@@ -243,7 +263,10 @@ impl QualitySettings {
243263

244264
fxaa: false,
245265

246-
use_bloom: false,
266+
bloom_settings: BloomSettings {
267+
use_bloom: false,
268+
..Default::default()
269+
},
247270

248271
use_parallax_mapping: false,
249272

fyrox-impl/src/renderer/shaders/bloom.shader

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
name: "properties",
1111
kind: PropertyGroup([
1212
(name: "worldViewProjection", kind: Matrix4()),
13+
(name: "threshold", kind: Float(value: 1.01)),
1314
]),
1415
binding: 0
1516
),
@@ -62,7 +63,7 @@
6263
void main() {
6364
vec3 hdrPixel = texture(hdrSampler, texCoord).rgb;
6465

65-
if (S_Luminance(hdrPixel) > 1.0) {
66+
if (S_Luminance(hdrPixel) > properties.threshold) {
6667
outBrightColor = vec4(hdrPixel, 0.0);
6768
} else {
6869
outBrightColor = vec4(0.0);

0 commit comments

Comments
 (0)