diff --git a/crates/bevy_render/src/camera/camera.rs b/crates/bevy_render/src/camera/camera.rs index c38757e93ed66..be6349689b7cb 100644 --- a/crates/bevy_render/src/camera/camera.rs +++ b/crates/bevy_render/src/camera/camera.rs @@ -2,6 +2,7 @@ use crate::{ camera::CameraProjection, camera::{ManualTextureViewHandle, ManualTextureViews}, prelude::Image, + primitives::Frustum, render_asset::RenderAssets, render_resource::TextureView, view::{ColorGrading, ExtractedView, ExtractedWindows, RenderLayers, VisibleEntities}, @@ -642,6 +643,7 @@ pub fn extract_cameras( &CameraRenderGraph, &GlobalTransform, &VisibleEntities, + &Frustum, Option<&ColorGrading>, Option<&TemporalJitter>, Option<&RenderLayers>, @@ -657,6 +659,7 @@ pub fn extract_cameras( camera_render_graph, transform, visible_entities, + frustum, color_grading, temporal_jitter, render_layers, @@ -714,6 +717,7 @@ pub fn extract_cameras( color_grading, }, visible_entities.clone(), + *frustum, )); if let Some(temporal_jitter) = temporal_jitter { diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index 9759684148324..73d8bf9c24e80 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -9,6 +9,7 @@ use crate::{ camera::{ExtractedCamera, ManualTextureViews, MipBias, TemporalJitter}, extract_resource::{ExtractResource, ExtractResourcePlugin}, prelude::{Image, Shader}, + primitives::Frustum, render_asset::RenderAssets, render_phase::ViewRangefinder3d, render_resource::{DynamicUniformBuffer, ShaderType, Texture, TextureView}, @@ -168,6 +169,7 @@ pub struct ViewUniform { world_position: Vec3, // viewport(x_origin, y_origin, width, height) viewport: Vec4, + frustum: [Vec4; 6], color_grading: ColorGrading, mip_bias: f32, } @@ -352,6 +354,7 @@ pub fn prepare_view_uniforms( views: Query<( Entity, &ExtractedView, + Option<&Frustum>, Option<&TemporalJitter>, Option<&MipBias>, )>, @@ -365,7 +368,7 @@ pub fn prepare_view_uniforms( else { return; }; - for (entity, camera, temporal_jitter, mip_bias) in &views { + for (entity, camera, frustum, temporal_jitter, mip_bias) in &views { let viewport = camera.viewport.as_vec4(); let unjittered_projection = camera.projection; let mut projection = unjittered_projection; @@ -386,6 +389,11 @@ pub fn prepare_view_uniforms( .unwrap_or_else(|| projection * inverse_view) }; + // Map Frustum type to shader array, 6> + let frustum = frustum + .map(|frustum| frustum.half_spaces.map(|h| h.normal_d())) + .unwrap_or([Vec4::ZERO; 6]); + let view_uniforms = ViewUniformOffset { offset: writer.write(&ViewUniform { view_proj, @@ -397,6 +405,7 @@ pub fn prepare_view_uniforms( inverse_projection, world_position: camera.transform.translation(), viewport, + frustum, color_grading: camera.color_grading, mip_bias: mip_bias.unwrap_or(&MipBias(0.0)).0, }), diff --git a/crates/bevy_render/src/view/view.wgsl b/crates/bevy_render/src/view/view.wgsl index 86ae3359f72cc..caa2b3a122f3e 100644 --- a/crates/bevy_render/src/view/view.wgsl +++ b/crates/bevy_render/src/view/view.wgsl @@ -18,6 +18,7 @@ struct View { world_position: vec3, // viewport(x_origin, y_origin, width, height) viewport: vec4, + frustum: array, 6>, color_grading: ColorGrading, mip_bias: f32, };