Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_post_process/src/auto_exposure/pipeline.rs
6596 views
1
use super::compensation_curve::{
2
AutoExposureCompensationCurve, AutoExposureCompensationCurveUniform,
3
};
4
use bevy_asset::{load_embedded_asset, prelude::*};
5
use bevy_ecs::prelude::*;
6
use bevy_image::Image;
7
use bevy_render::{
8
globals::GlobalsUniform,
9
render_resource::{binding_types::*, *},
10
renderer::RenderDevice,
11
view::ViewUniform,
12
};
13
use bevy_shader::Shader;
14
use bevy_utils::default;
15
use core::num::NonZero;
16
17
#[derive(Resource)]
18
pub struct AutoExposurePipeline {
19
pub histogram_layout: BindGroupLayout,
20
pub histogram_shader: Handle<Shader>,
21
}
22
23
#[derive(Component)]
24
pub struct ViewAutoExposurePipeline {
25
pub histogram_pipeline: CachedComputePipelineId,
26
pub mean_luminance_pipeline: CachedComputePipelineId,
27
pub compensation_curve: Handle<AutoExposureCompensationCurve>,
28
pub metering_mask: Handle<Image>,
29
}
30
31
#[derive(ShaderType, Clone, Copy)]
32
pub struct AutoExposureUniform {
33
pub(super) min_log_lum: f32,
34
pub(super) inv_log_lum_range: f32,
35
pub(super) log_lum_range: f32,
36
pub(super) low_percent: f32,
37
pub(super) high_percent: f32,
38
pub(super) speed_up: f32,
39
pub(super) speed_down: f32,
40
pub(super) exponential_transition_distance: f32,
41
}
42
43
#[derive(PartialEq, Eq, Hash, Clone)]
44
pub enum AutoExposurePass {
45
Histogram,
46
Average,
47
}
48
49
pub const HISTOGRAM_BIN_COUNT: u64 = 64;
50
51
pub fn init_auto_exposure_pipeline(
52
mut commands: Commands,
53
render_device: Res<RenderDevice>,
54
asset_server: Res<AssetServer>,
55
) {
56
commands.insert_resource(AutoExposurePipeline {
57
histogram_layout: render_device.create_bind_group_layout(
58
"compute histogram bind group",
59
&BindGroupLayoutEntries::sequential(
60
ShaderStages::COMPUTE,
61
(
62
uniform_buffer::<GlobalsUniform>(false),
63
uniform_buffer::<AutoExposureUniform>(false),
64
texture_2d(TextureSampleType::Float { filterable: false }),
65
texture_2d(TextureSampleType::Float { filterable: false }),
66
texture_1d(TextureSampleType::Float { filterable: false }),
67
uniform_buffer::<AutoExposureCompensationCurveUniform>(false),
68
storage_buffer_sized(false, NonZero::<u64>::new(HISTOGRAM_BIN_COUNT * 4)),
69
storage_buffer_sized(false, NonZero::<u64>::new(4)),
70
storage_buffer::<ViewUniform>(true),
71
),
72
),
73
),
74
histogram_shader: load_embedded_asset!(asset_server.as_ref(), "auto_exposure.wgsl"),
75
});
76
}
77
78
impl SpecializedComputePipeline for AutoExposurePipeline {
79
type Key = AutoExposurePass;
80
81
fn specialize(&self, pass: AutoExposurePass) -> ComputePipelineDescriptor {
82
ComputePipelineDescriptor {
83
label: Some("luminance compute pipeline".into()),
84
layout: vec![self.histogram_layout.clone()],
85
shader: self.histogram_shader.clone(),
86
shader_defs: vec![],
87
entry_point: Some(match pass {
88
AutoExposurePass::Histogram => "compute_histogram".into(),
89
AutoExposurePass::Average => "compute_average".into(),
90
}),
91
..default()
92
}
93
}
94
}
95
96