Rendering an image as a texture
This commit is contained in:
parent
29095b589d
commit
0a3cd3e809
BIN
shaders/frag.spv
BIN
shaders/frag.spv
Binary file not shown.
@ -1,9 +1,12 @@
|
||||
#version 450
|
||||
|
||||
layout(binding = 1) uniform sampler2D texSampler;
|
||||
|
||||
layout(location = 0) in vec3 fragColor;
|
||||
layout(location = 1) in vec2 fragTexCoord;
|
||||
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
void main() {
|
||||
outColor = vec4(fragColor, 1.0);
|
||||
outColor = texture(texSampler, fragTexCoord);
|
||||
}
|
||||
|
@ -8,10 +8,13 @@ layout(binding = 0) uniform UniformBufferObject {
|
||||
|
||||
layout(location = 0) in vec2 inPosition;
|
||||
layout(location = 1) in vec3 inColor;
|
||||
layout(location = 2) in vec2 inTexCoord;
|
||||
|
||||
layout(location = 0) out vec3 fragColor;
|
||||
layout(location = 1) out vec2 fragTexCoord;
|
||||
|
||||
void main() {
|
||||
gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
|
||||
fragColor = inColor;
|
||||
fragTexCoord = inTexCoord;
|
||||
}
|
||||
|
BIN
shaders/vert.spv
BIN
shaders/vert.spv
Binary file not shown.
24
src/app.rs
24
src/app.rs
@ -32,10 +32,26 @@ pub const MAX_FRAMES_IN_FLIGHT: usize = 2;
|
||||
|
||||
lazy_static! {
|
||||
pub static ref VERTICES: Vec<Vertex> = 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)
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -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<()> {
|
||||
|
@ -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::<glm::Vec2>() as u32)
|
||||
.build();
|
||||
|
||||
[pos, color]
|
||||
let tex_coord = vk::VertexInputAttributeDescription::builder()
|
||||
.binding(0)
|
||||
.location(2)
|
||||
.format(vk::Format::R32G32_SFLOAT)
|
||||
.offset((size_of::<glm::Vec2>() + size_of::<glm::Vec3>()) as u32)
|
||||
.build();
|
||||
|
||||
[pos, color, tex_coord]
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user