use wgpu::{Device, Sampler, Texture, TextureFormat, TextureView};
pub struct Framebuffer {
pub texture: Texture,
view: TextureView,
sampler: Sampler,
}
impl Framebuffer {
pub fn new(device: &Device, format: TextureFormat, width: u32, height: u32) -> Self {
let size = wgpu::Extent3d {
width,
height,
depth_or_array_layers: 1,
};
let texture = device.create_texture(&wgpu::TextureDescriptor {
label: None,
size,
mip_level_count: 1,
sample_count: 1,
dimension: wgpu::TextureDimension::D2,
format,
usage: wgpu::TextureUsages::TEXTURE_BINDING
| wgpu::TextureUsages::RENDER_ATTACHMENT
| wgpu::TextureUsages::COPY_SRC,
});
let view = texture.create_view(&wgpu::TextureViewDescriptor::default());
let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
address_mode_u: wgpu::AddressMode::Repeat,
address_mode_v: wgpu::AddressMode::Repeat,
address_mode_w: wgpu::AddressMode::Repeat,
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
mipmap_filter: wgpu::FilterMode::Linear,
lod_min_clamp: -100.0,
lod_max_clamp: 100.0,
compare: None,
label: None,
anisotropy_clamp: None,
..Default::default()
});
Self {
view,
sampler,
texture,
}
}
pub fn view(&self) -> &TextureView {
&self.view
}
pub fn sampler(&self) -> &Sampler {
&self.sampler
}
}