Files
Griffin 61dab1013a Large scenes (#22409)
# Objective

Move https://github.com/DGriffin91/bevy_bistro_scene and
https://github.com/DGriffin91/bevy_caldera_scene into the bevy repo for
allow for easier testing.

This also adds https://github.com/DGriffin91/bevy_mod_mipmap_generator
in the new `large_scene` folder because GPU texture fetch cache locality
is important. This could be eventually available more generally as a
part of bevy. But wanted to get something quick and basic in for now.

Not totally sure what these readme's should look like. I mostly just
copied them over and made a few tweaks.

This PR is meant to just be an initial starting point, it does not
address automatically acquiring the required assets.

---------

Co-authored-by: François Mockers <francois.mockers@vleue.com>
2026-01-09 00:59:28 +00:00

4.1 KiB

mipmap_generator

Optionally use the compress feature and corresponding setting in MipmapGeneratorSettings to enable BCn compression. Note: Compression can take a long time depending on the quantity and resolution of the images.

Currently supported conversions:

  • R8Unorm -> Bc4RUnorm
  • Rg8Unorm -> Bc5RgUnorm
  • Rgba8Unorm -> Bc7RgbaUnorm
  • Rgba8UnormSrgb -> Bc7RgbaUnormSrgb

Optionally set compressed_image_data_cache_path in MipmapGeneratorSettings to cache raw compressed image data on disk. Only textures that are BCn compressed will be stored.

Test loading a gLTF, computing mips with texture compression, and caching compressed image data on disk: cargo run -p mipmap_generator --features compress --release --example load_gltf -- --compress --cache

Note

Bevy supports a variety of compressed image formats that can also contain mipmaps. This plugin is intended for situations where the use of those formats is impractical (mostly prototyping/testing). With this plugin, mipmap generation happens slowly on the cpu.

Instead of using this plugin, consider using the new CompressedImageSaver.

For generating compressed textures ahead of time also check out:

In my experience, many of these compressed formats can be used with bevy in gltf files. This can be done by converting and replacing the images included in the gltf and then setting the mimeType with something like: "mimeType": "image/ktx2" (for ktx2)

Usage

    .add_plugins(DefaultPlugins)
    // Add MipmapGeneratorPlugin after default plugins
    .add_plugin(MipmapGeneratorPlugin)
    // Add material types to be converted
    .add_systems(Update, generate_mipmaps::<StandardMaterial>)

When materials are created, mipmaps will be created for the images used in the material.

Mipmaps will not be generated for materials found on entities that also have the NoMipmapGeneration component.

Custom Materials

For use with custom materials, just implement the GetImages trait for the custom material.

pub trait GetImages {
    fn get_images(&self) -> Vec<&Handle<Image>>;
}

impl<T: GetImages + MaterialExtension> GetImages for ExtendedMaterial<StandardMaterial, T> {
    fn get_images(&self) -> Vec<&Handle<Image>> {
        let mut images: Vec<&Handle<Image>> = vec![
            &self.base.base_color_texture,
            &self.base.emissive_texture,
            &self.base.metallic_roughness_texture,
            &self.base.normal_map_texture,
            &self.base.occlusion_texture,
            &self.base.depth_map,
            #[cfg(feature = "pbr_transmission_textures")]
            &self.base.diffuse_transmission_texture,
            #[cfg(feature = "pbr_transmission_textures")]
            &self.base.specular_transmission_texture,
            #[cfg(feature = "pbr_transmission_textures")]
            &self.base.thickness_texture,
            #[cfg(feature = "pbr_multi_layer_material_textures")]
            &self.base.clearcoat_texture,
            #[cfg(feature = "pbr_multi_layer_material_textures")]
            &self.base.clearcoat_roughness_texture,
            #[cfg(feature = "pbr_multi_layer_material_textures")]
            &self.base.clearcoat_normal_texture,
            #[cfg(feature = "pbr_anisotropy_texture")]
            &self.base.anisotropy_texture,
            #[cfg(feature = "pbr_specular_textures")]
            &self.base.specular_texture,
            #[cfg(feature = "pbr_specular_textures")]
            &self.base.specular_tint_texture,
        ]
        .into_iter()
        .flatten()
        .collect();
        images.append(&mut self.extension.get_images());
        images
    }
}

TODO

  • Support more texture formats.
  • Support re-running if images are updated.