 f28b921209
			
		
	
	
		f28b921209
		
	
	
	
	
		
			
			# Objective
Users should be able to configure depth load operations on cameras. Currently every camera clears depth when it is rendered. But sometimes later passes need to rely on depth from previous passes.
## Solution
This adds the `Camera3d::depth_load_op` field with a new `Camera3dDepthLoadOp` value. This is a custom type because Camera3d uses "reverse-z depth" and this helps us record and document that in a discoverable way. It also gives us more control over reflection + other trait impls, whereas `LoadOp` is owned by the `wgpu` crate.
```rust
commands.spawn_bundle(Camera3dBundle {
    camera_3d: Camera3d {
        depth_load_op: Camera3dDepthLoadOp::Load,
        ..default()
    },
    ..default()
});
```
### two_passes example with the "second pass" camera configured to the default (clear depth to 0.0)

### two_passes example with the "second pass" camera configured to "load" the depth

---
## Changelog
### Added
* `Camera3d` now has a `depth_load_op` field, which can configure the Camera's main 3d pass depth loading behavior.
		
	
			
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Renders two 3d passes to the same window from different perspectives.
 | |
| 
 | |
| use bevy::{core_pipeline::clear_color::ClearColorConfig, prelude::*};
 | |
| 
 | |
| fn main() {
 | |
|     App::new()
 | |
|         .add_plugins(DefaultPlugins)
 | |
|         .add_startup_system(setup)
 | |
|         .run();
 | |
| }
 | |
| 
 | |
| /// set up a simple 3D scene
 | |
| fn setup(
 | |
|     mut commands: Commands,
 | |
|     mut meshes: ResMut<Assets<Mesh>>,
 | |
|     mut materials: ResMut<Assets<StandardMaterial>>,
 | |
| ) {
 | |
|     // plane
 | |
|     commands.spawn_bundle(PbrBundle {
 | |
|         mesh: meshes.add(Mesh::from(shape::Plane { size: 5.0 })),
 | |
|         material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
 | |
|         ..default()
 | |
|     });
 | |
|     // cube
 | |
|     commands.spawn_bundle(PbrBundle {
 | |
|         mesh: meshes.add(Mesh::from(shape::Cube { size: 1.0 })),
 | |
|         material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()),
 | |
|         transform: Transform::from_xyz(0.0, 0.5, 0.0),
 | |
|         ..default()
 | |
|     });
 | |
|     // light
 | |
|     commands.spawn_bundle(PointLightBundle {
 | |
|         point_light: PointLight {
 | |
|             intensity: 1500.0,
 | |
|             shadows_enabled: true,
 | |
|             ..default()
 | |
|         },
 | |
|         transform: Transform::from_xyz(4.0, 8.0, 4.0),
 | |
|         ..default()
 | |
|     });
 | |
|     // camera
 | |
|     commands.spawn_bundle(Camera3dBundle {
 | |
|         transform: Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
 | |
|         ..default()
 | |
|     });
 | |
| 
 | |
|     // camera
 | |
|     commands.spawn_bundle(Camera3dBundle {
 | |
|         transform: Transform::from_xyz(10.0, 10., -5.0).looking_at(Vec3::ZERO, Vec3::Y),
 | |
|         camera_3d: Camera3d {
 | |
|             clear_color: ClearColorConfig::None,
 | |
|             ..default()
 | |
|         },
 | |
|         camera: Camera {
 | |
|             // renders after / on top of the main camera
 | |
|             priority: 1,
 | |
|             ..default()
 | |
|         },
 | |
|         ..default()
 | |
|     });
 | |
| }
 |