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