This commit is contained in:
xsl
2025-09-16 19:24:55 +08:00
parent e6bef08ecf
commit 3d205ab184
2 changed files with 58 additions and 4 deletions
@@ -41,6 +41,7 @@ TextureLoading::~TextureLoading()
vkDestroyPipelineLayout(get_device().get_handle(), pipeline_layout, nullptr); vkDestroyPipelineLayout(get_device().get_handle(), pipeline_layout, nullptr);
vkDestroyPipelineLayout(get_device().get_handle(), pipeline_layout_bg, nullptr); vkDestroyPipelineLayout(get_device().get_handle(), pipeline_layout_bg, nullptr);
vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout, nullptr); vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout, nullptr);
vkDestroyDescriptorSetLayout(get_device().get_handle(), descriptor_set_layout_bg, nullptr);
} }
destroy_texture(texture); destroy_texture(texture);
@@ -483,6 +484,7 @@ void TextureLoading::build_command_buffers()
VkRect2D scissor = vkb::initializers::rect2D(width, height, 0, 0); VkRect2D scissor = vkb::initializers::rect2D(width, height, 0, 0);
vkCmdSetScissor(draw_cmd_buffers[i], 0, 1, &scissor); vkCmdSetScissor(draw_cmd_buffers[i], 0, 1, &scissor);
vkCmdBindDescriptorSets(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout_bg, 0, 1, &descriptor_set_bg, 0, NULL);
vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.background); vkCmdBindPipeline(draw_cmd_buffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.background);
vkCmdDraw(draw_cmd_buffers[i], 6, 1, 0, 0); vkCmdDraw(draw_cmd_buffers[i], 6, 1, 0, 0);
@@ -557,7 +559,7 @@ void TextureLoading::setup_descriptor_pool()
std::vector<VkDescriptorPoolSize> pool_sizes = std::vector<VkDescriptorPoolSize> pool_sizes =
{ {
vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1), vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1),
vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1) }; vkb::initializers::descriptor_pool_size(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2) };
VkDescriptorPoolCreateInfo descriptor_pool_create_info = VkDescriptorPoolCreateInfo descriptor_pool_create_info =
vkb::initializers::descriptor_pool_create_info( vkb::initializers::descriptor_pool_create_info(
@@ -570,9 +572,27 @@ void TextureLoading::setup_descriptor_pool()
void TextureLoading::setup_descriptor_set_layout_bg() void TextureLoading::setup_descriptor_set_layout_bg()
{ {
VkPipelineLayoutCreateInfo layout_info{ std::vector<VkDescriptorSetLayoutBinding> set_layout_bindings =
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO }; {
vkCreatePipelineLayout(get_device().get_handle(), &layout_info, nullptr, &pipeline_layout_bg); // Binding 1 : Fragment shader image sampler
vkb::initializers::descriptor_set_layout_binding(
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
VK_SHADER_STAGE_FRAGMENT_BIT,
0) };
VkDescriptorSetLayoutCreateInfo descriptor_layout =
vkb::initializers::descriptor_set_layout_create_info(
set_layout_bindings.data(),
static_cast<uint32_t>(set_layout_bindings.size()));
VK_CHECK(vkCreateDescriptorSetLayout(get_device().get_handle(), &descriptor_layout, nullptr, &descriptor_set_layout_bg));
VkPipelineLayoutCreateInfo pipeline_layout_create_info =
vkb::initializers::pipeline_layout_create_info(
&descriptor_set_layout_bg,
1);
VK_CHECK(vkCreatePipelineLayout(get_device().get_handle(), &pipeline_layout_create_info, nullptr, &pipeline_layout_bg));
} }
void TextureLoading::setup_descriptor_set_layout() void TextureLoading::setup_descriptor_set_layout()
@@ -643,6 +663,35 @@ void TextureLoading::setup_descriptor_set()
vkUpdateDescriptorSets(get_device().get_handle(), static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL); vkUpdateDescriptorSets(get_device().get_handle(), static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL);
} }
void TextureLoading::setup_descriptor_set_bg()
{
VkDescriptorSetAllocateInfo alloc_info =
vkb::initializers::descriptor_set_allocate_info(
descriptor_pool,
&descriptor_set_layout_bg,
1);
VK_CHECK(vkAllocateDescriptorSets(get_device().get_handle(), &alloc_info, &descriptor_set_bg));
VkDescriptorImageInfo image_descriptor;
image_descriptor.imageView = cam_text.view;
image_descriptor.sampler = cam_text.sampler;
image_descriptor.imageLayout = cam_text.image_layout;
std::vector<VkWriteDescriptorSet> write_descriptor_sets =
{
vkb::initializers::write_descriptor_set(
descriptor_set_bg,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
0,
&image_descriptor)
};
vkUpdateDescriptorSets(get_device().get_handle(), static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL);
}
void TextureLoading::prepare_pipeline_bg() void TextureLoading::prepare_pipeline_bg()
{ {
VkPipelineInputAssemblyStateCreateInfo input_assembly_state = VkPipelineInputAssemblyStateCreateInfo input_assembly_state =
@@ -864,6 +913,7 @@ bool TextureLoading::prepare(const vkb::ApplicationOptions& options)
prepare_pipeline_bg(); prepare_pipeline_bg();
setup_descriptor_pool(); setup_descriptor_pool();
setup_descriptor_set(); setup_descriptor_set();
setup_descriptor_set_bg();
build_command_buffers(); build_command_buffers();
prepared = true; prepared = true;
return true; return true;
@@ -75,7 +75,10 @@ public:
VkPipelineLayout pipeline_layout; VkPipelineLayout pipeline_layout;
VkPipelineLayout pipeline_layout_bg; VkPipelineLayout pipeline_layout_bg;
VkDescriptorSet descriptor_set; VkDescriptorSet descriptor_set;
VkDescriptorSet descriptor_set_bg;
VkDescriptorSetLayout descriptor_set_layout; VkDescriptorSetLayout descriptor_set_layout;
VkDescriptorSetLayout descriptor_set_layout_bg;
TextureLoading(); TextureLoading();
~TextureLoading(); ~TextureLoading();
@@ -89,6 +92,7 @@ public:
void setup_descriptor_set_layout(); void setup_descriptor_set_layout();
void setup_descriptor_set_layout_bg(); void setup_descriptor_set_layout_bg();
void setup_descriptor_set(); void setup_descriptor_set();
void setup_descriptor_set_bg();
void prepare_pipelines(); void prepare_pipelines();
void prepare_uniform_buffers(); void prepare_uniform_buffers();
void update_uniform_buffers(); void update_uniform_buffers();