diff options
| -rw-r--r-- | shaders/shader.frag | 5 | ||||
| -rw-r--r-- | src/graphics/permanent.rs | 10 | ||||
| -rw-r--r-- | src/graphics/render.rs | 25 | ||||
| -rw-r--r-- | src/graphics/window_dressing.rs | 8 |
4 files changed, 35 insertions, 13 deletions
diff --git a/shaders/shader.frag b/shaders/shader.frag index 20550ba..a2561d1 100644 --- a/shaders/shader.frag +++ b/shaders/shader.frag @@ -1,6 +1,7 @@ #version 460 -layout(binding = 1) uniform sampler2D textureSampler; +layout(binding = 1) uniform sampler textureSampler; +layout(binding = 2) uniform texture2D textureImage; layout(location = 0) in vec3 fragmentColor; layout(location = 1) in vec2 fragmentTextureCoordinate; @@ -9,7 +10,7 @@ layout(location = 0) out vec4 outColor; void main() { outColor = vec4(fragmentColor - * texture(textureSampler, + * texture(sampler2D(textureImage, textureSampler), fragmentTextureCoordinate).rgb, 1.0); } diff --git a/src/graphics/permanent.rs b/src/graphics/permanent.rs index df86284..b39dbdd 100644 --- a/src/graphics/permanent.rs +++ b/src/graphics/permanent.rs @@ -575,11 +575,17 @@ fn init_descriptor_set_layout(device: &Device) let sampler_binding = vk::DescriptorSetLayoutBinding::builder() .binding(1) - .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .descriptor_type(vk::DescriptorType::SAMPLER) .descriptor_count(1) .stage_flags(vk::ShaderStageFlags::FRAGMENT); - let bindings = [uniform_block_binding, sampler_binding]; + let texture_binding = vk::DescriptorSetLayoutBinding::builder() + .binding(2) + .descriptor_type(vk::DescriptorType::SAMPLED_IMAGE) + .descriptor_count(1) + .stage_flags(vk::ShaderStageFlags::FRAGMENT); + + let bindings = [uniform_block_binding, sampler_binding, texture_binding]; let descriptor_set_layout_info = vk::DescriptorSetLayoutCreateInfo::builder() .bindings(&bindings); diff --git a/src/graphics/render.rs b/src/graphics/render.rs index 7318574..c88b1d6 100644 --- a/src/graphics/render.rs +++ b/src/graphics/render.rs @@ -472,19 +472,30 @@ fn init_descriptor_sets(device: &Device, layout: &vk::DescriptorSetLayout, .descriptor_type(vk::DescriptorType::UNIFORM_BUFFER) .buffer_info(&buffer_info_list); - let image_info = vk::DescriptorImageInfo::builder() - .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL) - .image_view(*texture_image_view) + let sampler_image_info = vk::DescriptorImageInfo::builder() .sampler(*sampler); - let image_info_list = [image_info]; + let sampler_image_info_list = [sampler_image_info]; let sampler_write_info = vk::WriteDescriptorSet::builder() .dst_set(sets[index]) .dst_binding(1) .dst_array_element(0) - .descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) - .image_info(&image_info_list); + .descriptor_type(vk::DescriptorType::SAMPLER) + .image_info(&sampler_image_info_list); + + let texture_image_info = vk::DescriptorImageInfo::builder() + .image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL) + .image_view(*texture_image_view); + let texture_image_info_list = [texture_image_info]; + let texture_write_info = vk::WriteDescriptorSet::builder() + .dst_set(sets[index]) + .dst_binding(2) + .dst_array_element(0) + .descriptor_type(vk::DescriptorType::SAMPLED_IMAGE) + .image_info(&texture_image_info_list); - let write_info_list = [uniform_block_write_info, sampler_write_info]; + let write_info_list = [ + uniform_block_write_info, sampler_write_info, texture_write_info + ]; let copy_info_list: [vk::CopyDescriptorSet; 0] = []; unsafe { diff --git a/src/graphics/window_dressing.rs b/src/graphics/window_dressing.rs index cca0dc8..07dfaf0 100644 --- a/src/graphics/window_dressing.rs +++ b/src/graphics/window_dressing.rs @@ -428,10 +428,14 @@ fn init_descriptor_pool(device: &Device, count: usize) .descriptor_count(count as u32); let sampler_size = vk::DescriptorPoolSize::builder() - .type_(vk::DescriptorType::COMBINED_IMAGE_SAMPLER) + .type_(vk::DescriptorType::SAMPLER) .descriptor_count(count as u32); - let sizes = [uniform_block_size, sampler_size]; + let texture_size = vk::DescriptorPoolSize::builder() + .type_(vk::DescriptorType::SAMPLED_IMAGE) + .descriptor_count(count as u32); + + let sizes = [uniform_block_size, sampler_size, texture_size]; let pool_info = vk::DescriptorPoolCreateInfo::builder() .pool_sizes(&sizes) .max_sets(count as u32); |