#pragma once #include #include "api_vulkan_sample.h" // 顶点结构保持不变,因为背景 quad 可能不需要顶点缓冲区 struct TextureLoadingVertexStructure { float pos[3]; float uv[2]; float normal[3]; }; class TextureLoading : public ApiVulkanSample { public: struct Texture { VkSampler sampler; VkImage image; VkImageLayout image_layout; VkDeviceMemory device_memory; VkImageView view; uint32_t width, height; uint32_t mip_levels; }; Texture texture = { 0 }; Texture cam_text = { 0 }; // 将由外部函数初始化 std::unique_ptr vertex_buffer; std::unique_ptr index_buffer; uint32_t index_count; std::unique_ptr uniform_buffer_vs; struct { glm::mat4 projection; glm::mat4 model; glm::vec4 view_pos; float lod_bias = 0.0f; } ubo_vs; struct { VkPipeline solid; // 原有前景管线 VkPipeline background; // 新增背景管线 } pipelines; // 管线布局 VkPipelineLayout pipeline_layout; // 前景管线布局 VkPipelineLayout pipeline_layout_bg; // 背景管线布局 // 描述符集 VkDescriptorSet descriptor_set; // 前景描述符集 VkDescriptorSet descriptor_set_bg; // 背景描述符集 // 描述符集布局 VkDescriptorSetLayout descriptor_set_layout; // 前景描述符集布局 VkDescriptorSetLayout descriptor_set_layout_bg; // 背景描述符集布局 (仅包含 combined image sampler) static TextureLoading* Get() { return loadTextIns; } static TextureLoading* loadTextIns; TextureLoading(); ~TextureLoading(); virtual void request_gpu_features(vkb::PhysicalDevice& gpu) override; void build_command_buffers() override; void draw(); void generate_quad(); // 生成前景 quad void setup_descriptor_pool(); void setup_descriptor_set_layout(); void setup_descriptor_set_layout_bg(); // 新增:设置背景描述符集布局 void setup_descriptor_set(); void setup_descriptor_set_bg(); // 新增:设置背景描述符集 void prepare_pipelines(); void prepare_pipeline_bg(); // 新增:准备背景管线 void prepare_uniform_buffers(); void update_uniform_buffers(); bool prepare(const vkb::ApplicationOptions& options) override; virtual void render(float delta_time) override; virtual void view_changed() override; virtual void on_update_ui_overlay(vkb::Drawer& drawer) override; void destroy_texture(Texture texture); // 现有函数保持不变 void processWithVulkan(uint8_t* data, int width, int height, int format, int rowStride, size_t dataSize, Texture& out_texture); void createTexture(VkDevice device, VkPhysicalDevice physicalDevice, int width, int height, int format, Texture& texture); void updateTexture(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool, VkQueue queue, uint8_t* data, int width, int height, int rowStride, size_t dataSize, Texture& texture); uint32_t findMemoryType(VkPhysicalDevice physicalDevice, uint32_t typeFilter, VkMemoryPropertyFlags properties); VkCommandBuffer beginSingleTimeCommands(VkDevice device, VkCommandPool commandPool); void endSingleTimeCommands(VkDevice device, VkCommandPool commandPool, VkQueue queue, VkCommandBuffer commandBuffer); void transitionImageLayout(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout oldLayout, VkImageLayout newLayout); }; std::unique_ptr create_texture_loading();