diff --git a/src/utils/RenderPass.cppm b/src/utils/RenderPass.cppm
index 2d9e28e..50a1b2c 100644
--- a/src/utils/RenderPass.cppm
+++ b/src/utils/RenderPass.cppm
@@ -76,6 +76,7 @@ export namespace vht {
             m_framebuffers.clear();
             m_swapchain->recreate();
             m_depth_image->recreate();
+            m_g_buffer->recreate();
             create_framebuffers();
 
             m_window->reset_framebuffer_resized();
@@ -121,24 +122,96 @@ export namespace vht {
             depth_attachment_ref.attachment = 1;
             depth_attachment_ref.layout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
 
-            vk::SubpassDescription subpass;
-            subpass.pipelineBindPoint = vk::PipelineBindPoint::eGraphics;
-            subpass.setColorAttachments( color_attachment_ref );
-            subpass.setPDepthStencilAttachment( &depth_attachment_ref );
-
-            vk::SubpassDependency dependency;
-            dependency.srcSubpass = vk::SubpassExternal;
-            dependency.srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests;
-            dependency.srcAccessMask = {};
-            dependency.dstSubpass = 0;
-            dependency.dstStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput | vk::PipelineStageFlagBits::eEarlyFragmentTests;
-            dependency.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eDepthStencilAttachmentWrite;
-
-            const auto attachments = { color_attachment, depth_attachment };
+            vk::AttachmentDescription g_pos_attachment;
+            g_pos_attachment.format = m_g_buffer->pos_format();
+            g_pos_attachment.samples = vk::SampleCountFlagBits::e1;
+            g_pos_attachment.loadOp = vk::AttachmentLoadOp::eClear;
+            g_pos_attachment.storeOp = vk::AttachmentStoreOp::eDontCare; // 渲染通道内部使用，不需要 Store
+            g_pos_attachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
+            g_pos_attachment.stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
+            g_pos_attachment.initialLayout = vk::ImageLayout::eUndefined;
+            // 最终布局设为最后一个子通道使用时的布局，减少转换开销
+            g_pos_attachment.finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
+
+            vk::AttachmentDescription g_color_attachment;
+            g_color_attachment.format = m_g_buffer->color_format();
+            g_color_attachment.samples = vk::SampleCountFlagBits::e1;
+            g_color_attachment.loadOp = vk::AttachmentLoadOp::eClear;
+            g_color_attachment.storeOp = vk::AttachmentStoreOp::eDontCare;
+            g_color_attachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
+            g_color_attachment.stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
+            g_color_attachment.initialLayout = vk::ImageLayout::eUndefined;
+            g_color_attachment.finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
+
+            vk::AttachmentDescription g_normal_depth_attachment;
+            g_normal_depth_attachment.format = m_g_buffer->normal_depth_format();
+            g_normal_depth_attachment.samples = vk::SampleCountFlagBits::e1;
+            g_normal_depth_attachment.loadOp = vk::AttachmentLoadOp::eClear;
+            g_normal_depth_attachment.storeOp = vk::AttachmentStoreOp::eDontCare;
+            g_normal_depth_attachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
+            g_normal_depth_attachment.stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
+            g_normal_depth_attachment.initialLayout = vk::ImageLayout::eUndefined;
+            g_normal_depth_attachment.finalLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
+
+            // 用于第一个子通道的附件引用
+            vk::AttachmentReference g_pos_out_ref;
+            g_pos_out_ref.attachment = 2; // 后续附件绑定到帧缓冲的实际索引
+            g_pos_out_ref.layout = vk::ImageLayout::eColorAttachmentOptimal;
+            vk::AttachmentReference g_color_out_ref;
+            g_color_out_ref.attachment = 3;
+            g_color_out_ref.layout = vk::ImageLayout::eColorAttachmentOptimal;
+            vk::AttachmentReference g_normal_depth_out_ref;
+            g_normal_depth_out_ref.attachment = 4;
+            g_normal_depth_out_ref.layout = vk::ImageLayout::eColorAttachmentOptimal;
+
+            // 用于第二个子通道的附件引用
+            vk::AttachmentReference g_pos_input_ref;
+            g_pos_input_ref.attachment = 2;
+            g_pos_input_ref.layout = vk::ImageLayout::eShaderReadOnlyOptimal;
+            vk::AttachmentReference g_color_input_ref;
+            g_color_input_ref.attachment = 3;
+            g_color_input_ref.layout = vk::ImageLayout::eShaderReadOnlyOptimal;
+            vk::AttachmentReference g_normal_depth_input_ref;
+            g_normal_depth_input_ref.attachment = 4;
+            g_normal_depth_input_ref.layout = vk::ImageLayout::eShaderReadOnlyOptimal;
+
+            std::array<vk::SubpassDescription,2> subpasses;
+            subpasses[0].pipelineBindPoint = vk::PipelineBindPoint::eGraphics;
+            const auto first_attachments = { g_pos_out_ref, g_color_out_ref, g_normal_depth_out_ref };
+            subpasses[0].setColorAttachments( first_attachments );
+            subpasses[0].setPDepthStencilAttachment( &depth_attachment_ref );
+            subpasses[1].pipelineBindPoint = vk::PipelineBindPoint::eGraphics;
+            const auto second_attachments = { g_pos_input_ref, g_color_input_ref, g_normal_depth_input_ref };
+            subpasses[1].setInputAttachments( second_attachments );
+            subpasses[1].setColorAttachments( color_attachment_ref );
+
+
+            std::array<vk::SubpassDependency,2> dependencies;
+            dependencies[0].srcSubpass = vk::SubpassExternal;
+            dependencies[0].srcStageMask = vk::PipelineStageFlagBits::eFragmentShader;
+            dependencies[0].srcAccessMask = {};
+            dependencies[0].dstSubpass = 0;
+            dependencies[0].dstStageMask = vk::PipelineStageFlagBits::eEarlyFragmentTests;
+            dependencies[0].dstAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentWrite;
+            dependencies[1].srcSubpass = 0;
+            dependencies[1].srcStageMask = vk::PipelineStageFlagBits::eColorAttachmentOutput;
+            dependencies[1].srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
+            dependencies[1].dstSubpass = 1;
+            dependencies[1].dstStageMask = vk::PipelineStageFlagBits::eFragmentShader;
+            dependencies[1].dstAccessMask = vk::AccessFlagBits::eInputAttachmentRead;
+
+
+            const auto attachments = {
+                color_attachment,
+                depth_attachment,
+                g_pos_attachment,
+                g_color_attachment,
+                g_normal_depth_attachment
+            };
             vk::RenderPassCreateInfo create_info;
             create_info.setAttachments( attachments );
-            create_info.setSubpasses( subpass );
-            create_info.setDependencies( dependency );
+            create_info.setSubpasses( subpasses );
+            create_info.setDependencies( dependencies );
 
             m_render_pass = m_device->device().createRenderPass( create_info );
         }
@@ -152,7 +225,13 @@ export namespace vht {
             create_info.height = m_swapchain->extent().height;
             create_info.layers = 1;
             for (size_t i = 0; const auto& image_view : m_swapchain->image_views()) {
-                std::array<vk::ImageView, 2> attachments { image_view, m_depth_image->image_view() };
+                std::array<vk::ImageView, 5> attachments {
+                    image_view,
+                    m_depth_image->image_view(),
+                    m_g_buffer->pos_views(),
+                    m_g_buffer->color_views(),
+                    m_g_buffer->normal_depth_views()
+                };
                 create_info.setAttachments( attachments );
                 m_framebuffers.emplace_back( m_device->device().createFramebuffer(create_info) );
                 ++i;
