From 0a3cd3e809eafee8eb6114261148d1d044e3c038 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Wed, 19 Apr 2023 10:17:19 -0400 Subject: [PATCH] Rendering an image as a texture --- shaders/frag.spv | Bin 572 -> 728 bytes shaders/shader.frag | 5 ++++- shaders/shader.vert | 3 +++ shaders/vert.spv | Bin 1676 -> 1836 bytes src/app.rs | 24 ++++++++++++++++++++---- src/app/data.rs | 34 ++++++++++++++++++++++++++++++---- src/app/structs.rs | 20 ++++++++++++++++---- 7 files changed, 73 insertions(+), 13 deletions(-) diff --git a/shaders/frag.spv b/shaders/frag.spv index da37f7ede672fe162b5322c32f5938a7836409a7..9495412355d546c65016d807fb9ccd9311dbb93d 100644 GIT binary patch literal 728 zcmYk2O-lk{6oqfW)ed%Gzs^)sWI~uv(vp-!d{8joHhkhK*LqCX?;WUjtLUffK zT{NG@>tI*lNU>YnF(<2^tkYol=;Hm;MT_Df_<9C^%f7};lC*0$WKF4_G@7vk}d+28yvFyL2|FXEAqO14p3(Rai zeJjdr9sXg9=?U&k-Bp#*Q*Za=_*}}GF3{n3xD~s~~Y5Vvx8;3XFVjSg1vGi0|&<~iJ#|rAbO2rP^3N-Lfa$py5 JKdNxA_yuJMIcp|TtPE@nAYNKgVtPnw zg>!y>Q3{aDzzT%MKsqxIF1q%a+eMU_MppYSu y%M8TwKx_@=gX{r`f%pnQ+IX`jYc!*ZEszURW&#odVmqKBkWvu;FVGGPAO-+?EE-Y( delta 54 zcmZ3(*Tc)p%%sfDz`)4B&A`iGIFZ+sk#nN6;>Mf_jGHx>5*RnHV7|k+c?)X@BgbE$ IA`2h}04Y2R(*OVf diff --git a/src/app.rs b/src/app.rs index 05a7f59..1c449c9 100644 --- a/src/app.rs +++ b/src/app.rs @@ -32,10 +32,26 @@ pub const MAX_FRAMES_IN_FLIGHT: usize = 2; lazy_static! { pub static ref VERTICES: Vec = vec![ - Vertex::new(glm::vec2(-0.5, -0.5), glm::vec3(1.0, 0.0, 0.0)), - Vertex::new(glm::vec2(0.5, -0.5), glm::vec3(0.0, 1.0, 0.0)), - Vertex::new(glm::vec2(0.5, 0.5), glm::vec3(0.0, 0.0, 1.0)), - Vertex::new(glm::vec2(-0.5, 0.5), glm::vec3(1.0, 1.0, 1.0)), + Vertex::new( + glm::vec2(-0.5, -0.5), + glm::vec3(1.0, 0.0, 0.0), + glm::vec2(1.0, 0.0) + ), + Vertex::new( + glm::vec2(0.5, -0.5), + glm::vec3(0.0, 1.0, 0.0), + glm::vec2(0.0, 0.0) + ), + Vertex::new( + glm::vec2(0.5, 0.5), + glm::vec3(0.0, 0.0, 1.0), + glm::vec2(0.0, 1.0) + ), + Vertex::new( + glm::vec2(-0.5, 0.5), + glm::vec3(1.0, 1.0, 1.0), + glm::vec2(1.0, 1.0) + ), ]; } diff --git a/src/app/data.rs b/src/app/data.rs index 17136ed..7fa6bef 100644 --- a/src/app/data.rs +++ b/src/app/data.rs @@ -518,7 +518,13 @@ impl AppData { .descriptor_count(1) .stage_flags(vk::ShaderStageFlags::VERTEX); - let bindings = &[ubo_binding]; + let sampler_binding = vk::DescriptorSetLayoutBinding::builder() + .binding(1) + .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .descriptor_count(1) + .stage_flags(vk::ShaderStageFlags::FRAGMENT); + + let bindings = &[ubo_binding, sampler_binding]; let info = vk::DescriptorSetLayoutCreateInfo::builder().bindings(bindings); self.descriptor_set_layout = device.create_descriptor_set_layout(&info, None)?; @@ -884,7 +890,11 @@ impl AppData { .type_(vk::DescriptorType::UNIFORM_BUFFER) .descriptor_count(self.swapchain_images.len() as u32); - let pool_sizes = &[ubo_size]; + let sampler_size = vk::DescriptorPoolSize::builder() + .type_(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .descriptor_count(self.swapchain_images.len() as u32); + + let pool_sizes = &[ubo_size, sampler_size]; let info = vk::DescriptorPoolCreateInfo::builder() .pool_sizes(pool_sizes) .max_sets(self.swapchain_images.len() as u32); @@ -916,7 +926,23 @@ impl AppData { .descriptor_type(vk::DescriptorType::UNIFORM_BUFFER) .buffer_info(buffer_info); - device.update_descriptor_sets(&[ubo_write], &[] as &[vk::CopyDescriptorSet]); + let info = vk::DescriptorImageInfo::builder() + .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL) + .image_view(self.texture_image_view) + .sampler(self.texture_sampler); + + let image_info = &[info]; + let sampler_write = vk::WriteDescriptorSet::builder() + .dst_set(self.descriptor_sets[i]) + .dst_binding(1) + .dst_array_element(0) + .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .image_info(image_info); + + device.update_descriptor_sets( + &[ubo_write, sampler_write], + &[] as &[vk::CopyDescriptorSet], + ); } Ok(()) @@ -1118,7 +1144,7 @@ impl AppData { &self, device: &Device, image: vk::Image, - format: vk::Format, + _format: vk::Format, old_layout: vk::ImageLayout, new_layout: vk::ImageLayout, ) -> Result<()> { diff --git a/src/app/structs.rs b/src/app/structs.rs index 37f5e62..3fb93ea 100644 --- a/src/app/structs.rs +++ b/src/app/structs.rs @@ -99,11 +99,16 @@ impl SwapchainSupport { pub struct Vertex { pos: glm::Vec2, color: glm::Vec3, + tex_coord: glm::Vec2, } impl Vertex { - pub fn new(pos: glm::Vec2, color: glm::Vec3) -> Self { - Self { pos, color } + pub fn new(pos: glm::Vec2, color: glm::Vec3, tex_coord: glm::Vec2) -> Self { + Self { + pos, + color, + tex_coord, + } } pub fn binding_description() -> vk::VertexInputBindingDescription { @@ -114,7 +119,7 @@ impl Vertex { .build() } - pub fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 2] { + pub fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 3] { let pos = vk::VertexInputAttributeDescription::builder() .binding(0) .location(0) @@ -129,7 +134,14 @@ impl Vertex { .offset(size_of::() as u32) .build(); - [pos, color] + let tex_coord = vk::VertexInputAttributeDescription::builder() + .binding(0) + .location(2) + .format(vk::Format::R32G32_SFLOAT) + .offset((size_of::() + size_of::()) as u32) + .build(); + + [pos, color, tex_coord] } }