diff --git a/crates/bevy_ui/src/render/ui_material.wgsl b/crates/bevy_ui/src/render/ui_material.wgsl index db9628559de369..14f6b3e816aaa9 100644 --- a/crates/bevy_ui/src/render/ui_material.wgsl +++ b/crates/bevy_ui/src/render/ui_material.wgsl @@ -1,8 +1,13 @@ -#import bevy_render::view::View +#import bevy_render::{ + view::View, + globals::Globals, +} #import bevy_ui::ui_vertex_output::UiVertexOutput @group(0) @binding(0) var view: View; +@group(0) @binding(1) +var globals: Globals; @vertex fn vertex( diff --git a/crates/bevy_ui/src/render/ui_material_pipeline.rs b/crates/bevy_ui/src/render/ui_material_pipeline.rs index f952f726e1aebf..85fc75a8cb4607 100644 --- a/crates/bevy_ui/src/render/ui_material_pipeline.rs +++ b/crates/bevy_ui/src/render/ui_material_pipeline.rs @@ -15,6 +15,7 @@ use bevy_ecs::{ use bevy_math::{Mat4, Rect, Vec2, Vec4Swizzles}; use bevy_render::{ extract_component::ExtractComponentPlugin, + globals::{GlobalsBuffer, GlobalsUniform}, render_asset::RenderAssets, render_phase::*, render_resource::*, @@ -222,16 +223,28 @@ impl FromWorld for UiMaterialPipeline { let ui_layout = M::bind_group_layout(render_device); let view_layout = render_device.create_bind_group_layout(&BindGroupLayoutDescriptor { - entries: &[BindGroupLayoutEntry { - binding: 0, - visibility: ShaderStages::VERTEX | ShaderStages::FRAGMENT, - ty: BindingType::Buffer { - ty: BufferBindingType::Uniform, - has_dynamic_offset: true, - min_binding_size: Some(ViewUniform::min_size()), + entries: &[ + BindGroupLayoutEntry { + binding: 0, + visibility: ShaderStages::VERTEX | ShaderStages::FRAGMENT, + ty: BindingType::Buffer { + ty: BufferBindingType::Uniform, + has_dynamic_offset: true, + min_binding_size: Some(ViewUniform::min_size()), + }, + count: None, + }, + BindGroupLayoutEntry { + binding: 1, + visibility: ShaderStages::VERTEX | ShaderStages::FRAGMENT, + ty: BindingType::Buffer { + ty: BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: Some(GlobalsUniform::min_size()), + }, + count: None, }, - count: None, - }], + ], label: Some("ui_view_layout"), }); UiMaterialPipeline { @@ -432,18 +445,22 @@ pub fn prepare_uimaterial_nodes( mut ui_meta: ResMut, mut extracted_uinodes: ResMut>, view_uniforms: Res, + globals_buffer: Res, ui_material_pipeline: Res>, mut phases: Query<&mut RenderPhase>, mut previous_len: Local, ) { - if let Some(view_binding) = view_uniforms.uniforms.binding() { + if let (Some(view_binding), Some(globals_binding)) = ( + view_uniforms.uniforms.binding(), + globals_buffer.buffer.binding(), + ) { let mut batches: Vec<(Entity, UiMaterialBatch)> = Vec::with_capacity(*previous_len); ui_meta.vertices.clear(); ui_meta.view_bind_group = Some(render_device.create_bind_group( "ui_material_view_bind_group", &ui_material_pipeline.view_layout, - &BindGroupEntries::single(view_binding), + &BindGroupEntries::sequential((view_binding, globals_binding)), )); let mut index = 0; diff --git a/crates/bevy_ui/src/ui_material.rs b/crates/bevy_ui/src/ui_material.rs index 680d4aa4100e6c..7f5cd0923a5a6e 100644 --- a/crates/bevy_ui/src/ui_material.rs +++ b/crates/bevy_ui/src/ui_material.rs @@ -67,7 +67,8 @@ use bevy_render::render_resource::{AsBindGroup, RenderPipelineDescriptor, Shader /// /// If you only use the fragment shader make sure to import `UiVertexOutput` from /// `bevy_ui::ui_vertex_output` in your wgsl shader. -/// Also note that bind group 0 is always bound to the [`View Uniform`](bevy_render::view::ViewUniform). +/// Also note that bind group 0 is always bound to the [`View Uniform`](bevy_render::view::ViewUniform) +/// and the [`Globals Uniform`](bevy_render::globals::GlobalsUniform). /// /// ```wgsl /// #import bevy_ui::ui_vertex_output UiVertexOutput