diff --git a/src/utils/Descriptor.cppm b/src/utils/Descriptor.cppm
index 156c44c..72f9a3c 100644
--- a/src/utils/Descriptor.cppm
+++ b/src/utils/Descriptor.cppm
@@ -41,6 +41,7 @@ export namespace vht {
         std::shared_ptr<vht::LightUniformBuffer> m_light_uniform_buffer;
         vk::raii::DescriptorPool m_pool{ nullptr };
         std::vector<vk::raii::DescriptorSet> m_sets;
+        std::vector<vk::raii::DescriptorSet> m_second_sets;
     public:
         explicit Descriptor(
             std::shared_ptr<vht::Device> device,
@@ -62,6 +63,14 @@ export namespace vht {
         const vk::raii::DescriptorPool& pool() const { return m_pool; }
         [[nodiscard]]
         const std::vector<vk::raii::DescriptorSet>& sets() const { return m_sets; }
+        [[nodiscard]]
+        const std::vector<vk::raii::DescriptorSet>& second_sets() const { return m_second_sets; }
+
+        void recreate() {
+            m_sets.clear();
+            m_second_sets.clear();
+            create_descriptor_sets();
+        }
 
     private:
         void init() {
@@ -70,16 +79,18 @@ export namespace vht {
         }
         // 创建描述符池
         void create_descriptor_pool() {
-            std::array<vk::DescriptorPoolSize, 2> pool_sizes;
+            std::array<vk::DescriptorPoolSize, 3> pool_sizes;
             pool_sizes[0].type = vk::DescriptorType::eUniformBuffer;
             pool_sizes[0].descriptorCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT * 2); // 包括 Light UBO
             pool_sizes[1].type = vk::DescriptorType::eCombinedImageSampler;
             pool_sizes[1].descriptorCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);
+            pool_sizes[2].type = vk::DescriptorType::eInputAttachment;
+            pool_sizes[2].descriptorCount = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT * 3);
 
             vk::DescriptorPoolCreateInfo poolInfo;
             poolInfo.flags = vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet;
             poolInfo.setPoolSizes( pool_sizes );
-            poolInfo.maxSets = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT);
+            poolInfo.maxSets = static_cast<uint32_t>(MAX_FRAMES_IN_FLIGHT * 2);
 
             m_pool = m_device->device().createDescriptorPool(poolInfo);
         }
@@ -103,12 +114,7 @@ export namespace vht {
                 image_info.imageView = m_texture_sampler->image_view();
                 image_info.sampler = m_texture_sampler->sampler();
 
-                vk::DescriptorBufferInfo light_buffer_info;
-                light_buffer_info.buffer = m_light_uniform_buffer->buffers()[i];
-                light_buffer_info.offset = 0;
-                light_buffer_info.range = sizeof(LightUBO);
-
-                std::array<vk::WriteDescriptorSet, 3> writes;
+                std::array<vk::WriteDescriptorSet, 2> writes;
                 writes[0].dstSet = m_sets[i];
                 writes[0].dstBinding = 0;
                 writes[0].dstArrayElement = 0;
@@ -119,11 +125,42 @@ export namespace vht {
                 writes[1].dstArrayElement = 0;
                 writes[1].descriptorType = vk::DescriptorType::eCombinedImageSampler;
                 writes[1].setImageInfo(image_info);
-                writes[2].dstSet = m_sets[i];
-                writes[2].dstBinding = 2;
-                writes[2].dstArrayElement = 0;
-                writes[2].descriptorType = vk::DescriptorType::eUniformBuffer;
-                writes[2].setBufferInfo(light_buffer_info);
+
+                m_device->device().updateDescriptorSets(writes, nullptr);
+            }
+
+            std::vector<vk::DescriptorSetLayout> second_layouts(MAX_FRAMES_IN_FLIGHT, *m_graphics_pipeline->second_descriptor_set_layout());
+            vk::DescriptorSetAllocateInfo second_alloc_info;
+            second_alloc_info.descriptorPool = m_pool;
+            second_alloc_info.setSetLayouts( second_layouts );
+
+            m_second_sets = m_device->device().allocateDescriptorSets(second_alloc_info);
+
+            for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+                vk::DescriptorBufferInfo light_buffer_info;
+                light_buffer_info.buffer = m_light_uniform_buffer->buffers()[i];
+                light_buffer_info.offset = 0;
+                light_buffer_info.range = sizeof(LightUBO);
+
+                std::array<vk::DescriptorImageInfo, 3> input_attachments;
+                input_attachments[0].imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
+                input_attachments[0].imageView = m_g_buffer->pos_views();
+                input_attachments[1].imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
+                input_attachments[1].imageView = m_g_buffer->color_views();
+                input_attachments[2].imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
+                input_attachments[2].imageView = m_g_buffer->normal_depth_views();
+
+                std::array<vk::WriteDescriptorSet, 2> writes;
+                writes[0].dstSet = m_second_sets[i];
+                writes[0].dstBinding = 0;
+                writes[0].dstArrayElement = 0;
+                writes[0].descriptorType = vk::DescriptorType::eUniformBuffer;
+                writes[0].setBufferInfo(light_buffer_info);
+                writes[1].dstSet = m_second_sets[i];
+                writes[1].dstBinding = 1;
+                writes[1].dstArrayElement = 0;
+                writes[1].descriptorType = vk::DescriptorType::eInputAttachment;
+                writes[1].setImageInfo(input_attachments);
 
                 m_device->device().updateDescriptorSets(writes, nullptr);
             }
