diff --git a/src/utils/Drawer.cppm b/src/utils/Drawer.cppm
index 1d33377..41e20cd 100644
--- a/src/utils/Drawer.cppm
+++ b/src/utils/Drawer.cppm
@@ -14,6 +14,8 @@ import DataLoader;
 import Window;
 import Device;
 import Swapchain;
+import ShadowRenderPass;
+import ShadowPipeline;
 import RenderPass;
 import GraphicsPipeline;
 import CommandPool;
@@ -48,6 +50,8 @@ export namespace vht {
         std::shared_ptr<vht::Window> m_window{ nullptr };
         std::shared_ptr<vht::Device> m_device{ nullptr };
         std::shared_ptr<vht::Swapchain> m_swapchain{ nullptr };
+        std::shared_ptr<vht::ShadowRenderPass> m_shadow_render_pass{ nullptr };
+        std::shared_ptr<vht::ShadowPipeline> m_shadow_pipeline{ nullptr };
         std::shared_ptr<vht::RenderPass> m_render_pass{ nullptr };
         std::shared_ptr<vht::GraphicsPipeline> m_graphics_pipeline{ nullptr };
         std::shared_ptr<vht::CommandPool> m_command_pool{ nullptr };
@@ -66,6 +70,8 @@ export namespace vht {
             std::shared_ptr<vht::Window> window,
             std::shared_ptr<vht::Device> device,
             std::shared_ptr<vht::Swapchain> swapchain,
+            std::shared_ptr<vht::ShadowRenderPass> shadow_render_pass,
+            std::shared_ptr<vht::ShadowPipeline> shadow_pipeline,
             std::shared_ptr<vht::RenderPass> render_pass,
             std::shared_ptr<vht::GraphicsPipeline> graphics_pipeline,
             std::shared_ptr<vht::CommandPool> command_pool,
@@ -77,6 +83,8 @@ export namespace vht {
             m_window(std::move(window)),
             m_device(std::move(device)),
             m_swapchain(std::move(swapchain)),
+            m_shadow_render_pass(std::move(shadow_render_pass)),
+            m_shadow_pipeline(std::move(shadow_pipeline)),
             m_render_pass(std::move(render_pass)),
             m_graphics_pipeline(std::move(graphics_pipeline)),
             m_command_pool(std::move(command_pool)),
@@ -172,8 +180,38 @@ export namespace vht {
         }
         // 记录命令缓冲区
         void record_command_buffer(const vk::raii::CommandBuffer& command_buffer, const uint32_t image_index) const {
+            // 开始记录命令缓冲区
             command_buffer.begin( vk::CommandBufferBeginInfo{} );
 
+            // 记录阴影渲染通道的命令
+            vk::RenderPassBeginInfo shadow_pass_begin_info;
+            shadow_pass_begin_info.renderPass = m_shadow_render_pass->render_pass();
+            // 注意这里的帧缓冲区是阴影渲染通道的帧缓冲，使用 current_frame 索引而不是 image_index
+            shadow_pass_begin_info.framebuffer = m_shadow_render_pass->framebuffers()[m_current_frame];
+            shadow_pass_begin_info.renderArea.offset = vk::Offset2D{0, 0};
+            shadow_pass_begin_info.renderArea.extent = m_shadow_render_pass->extent(); // 注意这里使用阴影渲染通道的尺寸
+            constexpr vk::ClearValue shadow_clear_color = vk::ClearDepthStencilValue{ 1.0f ,0 };
+            shadow_pass_begin_info.setClearValues( shadow_clear_color );
+
+            command_buffer.beginRenderPass( shadow_pass_begin_info, vk::SubpassContents::eInline );
+            command_buffer.bindPipeline( vk::PipelineBindPoint::eGraphics, m_shadow_pipeline->pipeline() );
+            // 我们使用了静态视口与裁剪，因此此处无需设置
+            const std::vector<vk::Buffer> shadow_vertex_buffers = { *m_input_assembly->vertex_buffer() };
+            constexpr std::array<vk::DeviceSize,1> shadow_offsets = { 0 };
+            command_buffer.bindVertexBuffers( 0, shadow_vertex_buffers, shadow_offsets );
+            command_buffer.bindIndexBuffer( m_input_assembly->index_buffer(), 0, vk::IndexType::eUint32 );
+            command_buffer.bindDescriptorSets(
+                vk::PipelineBindPoint::eGraphics,
+                m_shadow_pipeline->pipeline_layout(),
+                0,
+                *m_descriptor->shadow_sets()[m_current_frame],
+                nullptr
+            );
+            command_buffer.drawIndexed(static_cast<uint32_t>(m_data_loader->indices().size()), 1, 0, 0, 0);
+            command_buffer.endRenderPass();
+
+
+
             vk::RenderPassBeginInfo render_pass_begin_info;
             render_pass_begin_info.renderPass = m_render_pass->render_pass();
             render_pass_begin_info.framebuffer = m_render_pass->framebuffers()[image_index];
