Skip to content

Commit 3628e09

Browse files
authored
Add frustum to shader View (#10306)
# Objective - Work towards GPU-driven culling (#10164) ## Solution - Pass the view frustum to the shader view uniform --- ## Changelog - View Frustums are now extracted to the render world and made available to shaders
1 parent d3e41e2 commit 3628e09

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

crates/bevy_render/src/camera/camera.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::{
22
camera::CameraProjection,
33
camera::{ManualTextureViewHandle, ManualTextureViews},
44
prelude::Image,
5+
primitives::Frustum,
56
render_asset::RenderAssets,
67
render_resource::TextureView,
78
view::{ColorGrading, ExtractedView, ExtractedWindows, RenderLayers, VisibleEntities},
@@ -642,6 +643,7 @@ pub fn extract_cameras(
642643
&CameraRenderGraph,
643644
&GlobalTransform,
644645
&VisibleEntities,
646+
&Frustum,
645647
Option<&ColorGrading>,
646648
Option<&TemporalJitter>,
647649
Option<&RenderLayers>,
@@ -657,6 +659,7 @@ pub fn extract_cameras(
657659
camera_render_graph,
658660
transform,
659661
visible_entities,
662+
frustum,
660663
color_grading,
661664
temporal_jitter,
662665
render_layers,
@@ -714,6 +717,7 @@ pub fn extract_cameras(
714717
color_grading,
715718
},
716719
visible_entities.clone(),
720+
*frustum,
717721
));
718722

719723
if let Some(temporal_jitter) = temporal_jitter {

crates/bevy_render/src/view/mod.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::{
99
camera::{ExtractedCamera, ManualTextureViews, MipBias, TemporalJitter},
1010
extract_resource::{ExtractResource, ExtractResourcePlugin},
1111
prelude::{Image, Shader},
12+
primitives::Frustum,
1213
render_asset::RenderAssets,
1314
render_phase::ViewRangefinder3d,
1415
render_resource::{DynamicUniformBuffer, ShaderType, Texture, TextureView},
@@ -168,6 +169,7 @@ pub struct ViewUniform {
168169
world_position: Vec3,
169170
// viewport(x_origin, y_origin, width, height)
170171
viewport: Vec4,
172+
frustum: [Vec4; 6],
171173
color_grading: ColorGrading,
172174
mip_bias: f32,
173175
}
@@ -352,6 +354,7 @@ pub fn prepare_view_uniforms(
352354
views: Query<(
353355
Entity,
354356
&ExtractedView,
357+
Option<&Frustum>,
355358
Option<&TemporalJitter>,
356359
Option<&MipBias>,
357360
)>,
@@ -365,7 +368,7 @@ pub fn prepare_view_uniforms(
365368
else {
366369
return;
367370
};
368-
for (entity, camera, temporal_jitter, mip_bias) in &views {
371+
for (entity, camera, frustum, temporal_jitter, mip_bias) in &views {
369372
let viewport = camera.viewport.as_vec4();
370373
let unjittered_projection = camera.projection;
371374
let mut projection = unjittered_projection;
@@ -386,6 +389,11 @@ pub fn prepare_view_uniforms(
386389
.unwrap_or_else(|| projection * inverse_view)
387390
};
388391

392+
// Map Frustum type to shader array<vec4<f32>, 6>
393+
let frustum = frustum
394+
.map(|frustum| frustum.half_spaces.map(|h| h.normal_d()))
395+
.unwrap_or([Vec4::ZERO; 6]);
396+
389397
let view_uniforms = ViewUniformOffset {
390398
offset: writer.write(&ViewUniform {
391399
view_proj,
@@ -397,6 +405,7 @@ pub fn prepare_view_uniforms(
397405
inverse_projection,
398406
world_position: camera.transform.translation(),
399407
viewport,
408+
frustum,
400409
color_grading: camera.color_grading,
401410
mip_bias: mip_bias.unwrap_or(&MipBias(0.0)).0,
402411
}),

crates/bevy_render/src/view/view.wgsl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ struct View {
1818
world_position: vec3<f32>,
1919
// viewport(x_origin, y_origin, width, height)
2020
viewport: vec4<f32>,
21+
frustum: array<vec4<f32>, 6>,
2122
color_grading: ColorGrading,
2223
mip_bias: f32,
2324
};

0 commit comments

Comments
 (0)