@@ -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+
100116impl 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}
0 commit comments