use std::path::Path; use image::GenericImageView; pub struct Texture { pub texture: wgpu::Texture, pub view: wgpu::TextureView, pub sampler: wgpu::Sampler, } impl Texture { pub fn from_file(device: &wgpu::Device, queue: &wgpu::Queue, str_path: &str) -> Self { let img_path = Path::new(str_path); let img = image::open(img_path).unwrap(); Self::from_image(&device, &queue, &img) } pub fn from_image(device: &wgpu::Device, queue: &wgpu::Queue, img: &image::DynamicImage) -> Self { // Data from image let img_dim = img.dimensions(); let img_data = img.as_rgba8().unwrap(); // Create texture on device let texture_size = wgpu::Extent3d { width: img_dim.0, height: img_dim.1, depth: 1, }; let texture = device.create_texture(&wgpu::TextureDescriptor { size: texture_size, mip_level_count: 1, sample_count: 1, dimension: wgpu::TextureDimension::D2, format: wgpu::TextureFormat::Rgba8UnormSrgb, usage: wgpu::TextureUsage::SAMPLED | wgpu::TextureUsage::COPY_DST, label: None, }); // Write texture to memory queue.write_texture( wgpu::TextureCopyView { texture: &texture, mip_level: 0, origin: wgpu::Origin3d::ZERO }, img_data, wgpu::TextureDataLayout { offset: 0, bytes_per_row: 4 * img_dim.0, rows_per_image: img_dim.1 }, texture_size, ); // Create view and sampler let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); let sampler = device.create_sampler( &wgpu::SamplerDescriptor { address_mode_u: wgpu::AddressMode::ClampToEdge, address_mode_v: wgpu::AddressMode::ClampToEdge, address_mode_w: wgpu::AddressMode::ClampToEdge, //mag_filter: wgpu::FilterMode::Linear, mag_filter: wgpu::FilterMode::Nearest, min_filter: wgpu::FilterMode::Nearest, mipmap_filter: wgpu::FilterMode::Nearest, ..Default::default() } ); Self { texture, view, sampler } } }