 dd14f3a477
			
		
	
	
		dd14f3a477
		
			
		
	
	
	
	
		
			
			 # Objective Lightmaps, textures that store baked global illumination, have been a mainstay of real-time graphics for decades. Bevy currently has no support for them, so this pull request implements them. ## Solution The new `Lightmap` component can be attached to any entity that contains a `Handle<Mesh>` and a `StandardMaterial`. When present, it will be applied in the PBR shader. Because multiple lightmaps are frequently packed into atlases, each lightmap may have its own UV boundaries within its texture. An `exposure` field is also provided, to control the brightness of the lightmap. Note that this PR doesn't provide any way to bake the lightmaps. That can be done with [The Lightmapper] or another solution, such as Unity's Bakery. --- ## Changelog ### Added * A new component, `Lightmap`, is available, for baked global illumination. If your mesh has a second UV channel (UV1), and you attach this component to the entity with that mesh, Bevy will apply the texture referenced in the lightmap. [The Lightmapper]: https://github.com/Naxela/The_Lightmapper --------- Co-authored-by: Carter Anderson <mcanders1@gmail.com>
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Rendering a scene with baked lightmaps.
 | |
| 
 | |
| use bevy::pbr::Lightmap;
 | |
| use bevy::prelude::*;
 | |
| 
 | |
| fn main() {
 | |
|     App::new()
 | |
|         .add_plugins(DefaultPlugins)
 | |
|         .insert_resource(AmbientLight {
 | |
|             color: Color::WHITE,
 | |
|             brightness: 0.2,
 | |
|         })
 | |
|         .add_systems(Startup, setup)
 | |
|         .add_systems(Update, add_lightmaps_to_meshes)
 | |
|         .run();
 | |
| }
 | |
| 
 | |
| fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
 | |
|     commands.spawn(SceneBundle {
 | |
|         scene: asset_server.load("models/CornellBox/CornellBox.glb#Scene0"),
 | |
|         ..default()
 | |
|     });
 | |
| 
 | |
|     commands.spawn(Camera3dBundle {
 | |
|         transform: Transform::from_xyz(-278.0, 273.0, 800.0),
 | |
|         ..default()
 | |
|     });
 | |
| }
 | |
| 
 | |
| fn add_lightmaps_to_meshes(
 | |
|     mut commands: Commands,
 | |
|     asset_server: Res<AssetServer>,
 | |
|     meshes: Query<(Entity, &Name), (With<Handle<Mesh>>, Without<Lightmap>)>,
 | |
| ) {
 | |
|     for (entity, name) in meshes.iter() {
 | |
|         if &**name == "large_box" {
 | |
|             commands.entity(entity).insert(Lightmap {
 | |
|                 image: asset_server.load("lightmaps/CornellBox-Large.zstd.ktx2"),
 | |
|                 ..default()
 | |
|             });
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if &**name == "small_box" {
 | |
|             commands.entity(entity).insert(Lightmap {
 | |
|                 image: asset_server.load("lightmaps/CornellBox-Small.zstd.ktx2"),
 | |
|                 ..default()
 | |
|             });
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if name.starts_with("cornell_box") {
 | |
|             commands.entity(entity).insert(Lightmap {
 | |
|                 image: asset_server.load("lightmaps/CornellBox-Box.zstd.ktx2"),
 | |
|                 ..default()
 | |
|             });
 | |
|             continue;
 | |
|         }
 | |
|     }
 | |
| }
 |