From a5a82e5b46332c06882535c6489054c08713f599 Mon Sep 17 00:00:00 2001 From: Piotrek Date: Mon, 12 Apr 2021 21:15:56 +0200 Subject: [PATCH] texture struct --- src/app.rs | 69 +++++++--------------------------------- src/bin/shader.frag.spv | Bin 452 -> 0 bytes src/bin/shader.vert.spv | Bin 1164 -> 0 bytes src/main.rs | 1 + src/texture.rs | 60 ++++++++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 57 deletions(-) delete mode 100644 src/bin/shader.frag.spv delete mode 100644 src/bin/shader.vert.spv create mode 100644 src/texture.rs diff --git a/src/app.rs b/src/app.rs index e96d201..3600cb5 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,9 +1,8 @@ use winit::{window::Window, dpi::PhysicalSize, event::WindowEvent}; use wgpu::util::DeviceExt; -use std::path::Path; -use image::GenericImageView; use crate::vertex::Vertex; +use crate::texture::Texture; const VERTICES: &[Vertex] = &[ Vertex { position: [-1.0, 1.0, 0.0], uv: [0.0, 0.0] }, @@ -28,7 +27,7 @@ pub struct App { vertex_buffer: wgpu::Buffer, index_buffer: wgpu::Buffer, // Texture - diffuse_bind_group: wgpu::BindGroup + bind_group: wgpu::BindGroup } impl App { @@ -71,53 +70,9 @@ impl App { let swapchain = device.create_swap_chain(&surface, &swapchain_desc); // Load image - let img_path = Path::new("./assets/rick.png"); - let img = image::open(img_path).unwrap(); - let img_dim = img.dimensions(); - let img_data = img.as_rgba8().unwrap(); + let tex = Texture::from_file(&device, &queue, "./assets/rick.png"); - let texture_size = wgpu::Extent3d { width: img_dim.0, height: img_dim.1, depth: 1, }; - let texture_desc = 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: Some("diffuse_texture"), - }; - let texture = device.create_texture(&texture_desc); - - queue.write_texture( - // Tells wgpu where to copy the pixel data - wgpu::TextureCopyView { - texture: &texture, - mip_level: 0, - origin: wgpu::Origin3d::ZERO, - }, - // The actual pixel data - img_data, - // The layout of the texture - wgpu::TextureDataLayout { - offset: 0, - bytes_per_row: 4 * img_dim.0, - rows_per_image: img_dim.1, - }, - texture_size, - ); - - let diffuse_texture_view = texture.create_view(&wgpu::TextureViewDescriptor::default()); - let diffuse_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, - min_filter: wgpu::FilterMode::Nearest, - mipmap_filter: wgpu::FilterMode::Nearest, - ..Default::default() - }); - - let texture_bind_group_layout = device.create_bind_group_layout( + let bind_group_layout = device.create_bind_group_layout( &wgpu::BindGroupLayoutDescriptor { entries: &[ wgpu::BindGroupLayoutEntry { @@ -140,21 +95,21 @@ impl App { count: None, }, ], - label: Some("texture_bind_group_layout"), + label: None, } ); - let diffuse_bind_group = device.create_bind_group( + let bind_group = device.create_bind_group( &wgpu::BindGroupDescriptor { - layout: &texture_bind_group_layout, + layout: &bind_group_layout, entries: &[ wgpu::BindGroupEntry { binding: 0, - resource: wgpu::BindingResource::TextureView(&diffuse_texture_view), + resource: wgpu::BindingResource::TextureView(&tex.view), }, wgpu::BindGroupEntry { binding: 1, - resource: wgpu::BindingResource::Sampler(&diffuse_sampler), + resource: wgpu::BindingResource::Sampler(&tex.sampler), } ], label: Some("diffuse_bind_group"), @@ -166,7 +121,7 @@ impl App { // Pipeline stuff let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { label: Some("Render Pipeline Layout"), - bind_group_layouts: &[&texture_bind_group_layout], + bind_group_layouts: &[&bind_group_layout], push_constant_ranges: &[], }); let vert_state = wgpu::VertexState { //vert @@ -228,7 +183,7 @@ impl App { // Save values in app println!("Initialized"); - Self { surface, device, queue, swapchain_desc, swapchain, pipeline, vertex_buffer, index_buffer, diffuse_bind_group } + Self { surface, device, queue, swapchain_desc, swapchain, pipeline, vertex_buffer, index_buffer, bind_group } } pub fn resize(&mut self, new_size: Option>) { @@ -279,7 +234,7 @@ impl App { }); render_pass.set_pipeline(&self.pipeline); - render_pass.set_bind_group(0, &self.diffuse_bind_group, &[]); + render_pass.set_bind_group(0, &self.bind_group, &[]); render_pass.set_vertex_buffer(0, self.vertex_buffer.slice(..)); render_pass.set_index_buffer(self.index_buffer.slice(..), wgpu::IndexFormat::Uint16); render_pass.draw_indexed(0..(INDICES.len() as u32), 0, 0..1); diff --git a/src/bin/shader.frag.spv b/src/bin/shader.frag.spv deleted file mode 100644 index 232ea0e81b049a49f19714079a560760dd52c95b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452 zcmYjO%Sr=55G=FVBqrt|g5D(JQ3)P22x2_RTn2LR0|wb$VPM^aWEH&m8}V~I$N%vn zST!cH4ZYn}Q`23;Mzzx>u!AFDz6LW&-uAe5$0O`TQw z{OAiE>@o+`h~sc}5hntlyin&RW1X2!jlFlteD0RzTb{Yx7nw`_B1=mDnn~BH=zNjn zFKJZ}Q&HV1ti4YzndP$u%myEmQykENJe&kK2>l`Z2Du^ghWGMSlo-gD+X=cF;aHy^@GSPaYIUZ`v>%z}il6k28MbdS6H<6^M?_{k#~ zE1^*m<*WvlV{`bIUd+vx@oRX4Z6tb4cy>6InD_ZWMNPgP@Mzil zlsWJnnA){E)>w7_zRZ7~y5y;$=9!CmCmlNG@;V^uu)dG4gNpCMagF&VS&P`lx8VDd z*6y{z?*g%nYY!&%IdU~^Q!f(bi|vp(tKP$&-iCLcSnGT~sl6{T=d6^xYG3DAui~1z zE)bog=32)Zx$D(&ktj#ZzT95wAI$UO6}G+CbimXJvYfi_<3Oe4w>h5%~Q_cUHDF# z_#coa(OK^8e@*TSYBg-*&VLEpo|<2=!nti+Opbgt?BZ?w103&j4;RyF>=wD$41UBk d=iSET+Vg%rgLBk>7x&$LTXk5=|H}@~@P8Y1S 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, + min_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, + ..Default::default() + } + ); + + Self { texture, view, sampler } + } + +} \ No newline at end of file