Generate mipmaps for wgpu textures.
Add this to your Cargo.toml
:
[dependencies]
wgpu-mipmap = "0.1"
Example usage:
use wgpu_mipmap::*;
fn example(device: &wgpu::Device, queue: &wgpu::Queue) -> Result<(), Error> {
// create a recommended generator
let generator = RecommendedMipmapGenerator::new(&device);
// create and upload data to a texture
let texture_descriptor = wgpu::TextureDescriptor {
size: wgpu::Extent3d {
width: 512,
height: 512,
depth: 1,
},
mip_level_count: 10, // 1 + log2(512)
sample_count: 1,
format: wgpu::TextureFormat::Rgba8Unorm,
dimension: wgpu::TextureDimension::D2,
usage: wgpu::TextureUsage::STORAGE,
label: None,
};
let texture = device.create_texture(&texture_descriptor);
// upload_data_to_texture(&texture);
// create an encoder and generate mipmaps for the texture
let mut encoder = device.create_command_encoder(&Default::default());
generator.generate(&device, &mut encoder, &texture, &texture_descriptor)?;
queue.submit(std::iter::once(encoder.finish()));
Ok(())
}
wgpu-mipmap is in the early stages of development and can only generate mipmaps for 2D textures with floating-point formats. The library implements several backends in order to support various texture usage patterns:
ComputeMipmapGenerator
: For power of two textures with with usageTextureUsage::STORAGE
. Uses a compute pipeline to generate mipmaps.RenderMipmapGenerator
: For textures with usageTextureUsage::OUTPUT_ATTACHMENT
. Uses a render pipeline to generate mipmaps.CopyMipmapGenerator
: For textures with usageTextureUsage::SAMPLED
. Allocates a new texture, uses a render pipeline to generate mipmaps in the new texture, then copies the result back to the original texture.RecommendedMipmapGenerator
: Uses one of the above implementations depending on texture usage (prefers the compute backend, followed by the render backend, and finally the copy backend).
The examples test various use cases and generate images for manual inspection and comparsion.
$ cargo run --example cat
$ cargo run --example checkerboard
$ cargo test
$ make build-shaders
See src/shaders/README.md for dependencies and more information.
TODO