An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

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 -> 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.

![example_without](example_without.jpg)
*without mipmaps*

![example_with](example_with.jpg)
*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.