https://github.com/DGriffin91/bevy_mod_mipmap_generator
A basic mipmap generator for bevy
https://github.com/DGriffin91/bevy_mod_mipmap_generator
Last synced: about 2 months ago
JSON representation
A basic mipmap generator for bevy
- Host: GitHub
- URL: https://github.com/DGriffin91/bevy_mod_mipmap_generator
- Owner: DGriffin91
- License: apache-2.0
- Created: 2022-11-16T02:16:18.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-02-13T19:37:26.000Z (5 months ago)
- Last Synced: 2025-05-05T14:07:21.618Z (about 2 months ago)
- Language: Rust
- Size: 8.98 MB
- Stars: 32
- Watchers: 3
- Forks: 10
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
- awesome-bevy - `bevy_mod_mipmap_generator`
README
# bevy_mod_mipmap_generator
## A basic mipmap generator for bevy 0.16.
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 -> Bc7RgbaUnormSrgbOptionally 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.

*without mipmaps*
*with mipmaps*## Note
Bevy supports a [variety of compressed image formats](https://docs.rs/bevy/latest/bevy/render/texture/enum.ImageFormat.html) 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](https://bevyengine.org/news/bevy-0-12/#compressedimagesaver).
For generating compressed textures ahead of time also check out:
- [klafsa](https://github.com/superdump/klafsa)
- [kram](https://github.com/alecazam/kram)
- [toktx](https://github.khronos.org/KTX-Software/ktxtools/toktx.html)
- [compressonator](https://gpuopen.com/compressonator/)
- [basis_universal](https://github.com/BinomialLLC/basis_universal)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
```rust
.add_plugins(DefaultPlugins)
// Add MipmapGeneratorPlugin after default plugins
.add_plugin(MipmapGeneratorPlugin)
// Add material types to be converted
.add_systems(Update, generate_mipmaps::)
```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.```rust
pub trait GetImages {
fn get_images(&self) -> Vec<&Handle>;
}impl GetImages for ExtendedMaterial {
fn get_images(&self) -> Vec<&Handle> {
let mut images: Vec<&Handle> = 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.