diff --git a/src/App.cppm b/src/App.cppm
index f999739..8f3a428 100644
--- a/src/App.cppm
+++ b/src/App.cppm
@@ -17,6 +17,8 @@ import Device;
 import Swapchain;
 import DepthImage;
 import ShadowDepthImage;
+import ShadowRenderPass;
+import ShadowPipeline;
 import RenderPass;
 import GraphicsPipeline;
 import CommandPool;
@@ -36,6 +38,8 @@ export namespace vht {
         std::shared_ptr<vht::Swapchain> m_swapchain{ nullptr };
         std::shared_ptr<vht::DepthImage> m_depth_image{ nullptr };
         std::shared_ptr<vht::ShadowDepthImage> m_shadow_depth_image{ 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 };
@@ -71,6 +75,10 @@ export namespace vht {
             std::cout << "depth image created" << std::endl;
             init_shadow_depth_image();
             std::cout << "shadow depth image created" << std::endl;
+            init_shadow_render_pass();
+            std::cout << "shadow render pass created" << std::endl;
+            init_shadow_pipeline();
+            std::cout << "shadow pipeline created" << std::endl;
             init_render_pass();
             std::cout << "render pass created" << std::endl;
             init_graphics_pipeline();
@@ -97,6 +105,8 @@ export namespace vht {
         void init_swapchain() { m_swapchain = std::make_shared<vht::Swapchain>( m_window, m_device ); }
         void init_depth_image() { m_depth_image = std::make_shared<vht::DepthImage>( m_device, m_swapchain ); }
         void init_shadow_depth_image() { m_shadow_depth_image = std::make_shared<vht::ShadowDepthImage>( m_device ); }
+        void init_shadow_render_pass() { m_shadow_render_pass = std::make_shared<vht::ShadowRenderPass>( m_device, m_shadow_depth_image ); }
+        void init_shadow_pipeline() { m_shadow_pipeline = std::make_shared<vht::ShadowPipeline>(m_device, m_shadow_render_pass); }
         void init_render_pass() { m_render_pass = std::make_shared<vht::RenderPass>( m_window, m_device, m_swapchain, m_depth_image ); }
         void init_graphics_pipeline() { m_graphics_pipeline = std::make_shared<vht::GraphicsPipeline>( m_device, m_render_pass ); }
         void init_command_pool() { m_command_pool = std::make_shared<vht::CommandPool>( m_device ); }
@@ -104,13 +114,25 @@ export namespace vht {
         void init_uniform_buffer() { m_uniform_buffer = std::make_shared<vht::UniformBuffer>( m_window, m_device, m_swapchain ); }
         void init_texture_sampler() { m_texture_sampler = std::make_shared<vht::TextureSampler>( m_device, m_command_pool ); }
         void init_light_uniform_buffer() { m_light_uniform_buffer = std::make_shared<vht::LightUniformBuffer>( m_device ); }
-        void init_descriptor() { m_descriptor = std::make_shared<vht::Descriptor>( m_device, m_graphics_pipeline, m_uniform_buffer, m_texture_sampler, m_light_uniform_buffer ); }
+        void init_descriptor() {
+            m_descriptor = std::make_shared<vht::Descriptor>(
+                m_device,
+                m_shadow_depth_image,
+                m_shadow_pipeline,
+                m_graphics_pipeline,
+                m_uniform_buffer,
+                m_texture_sampler,
+                m_light_uniform_buffer
+            );
+        }
         void init_drawer() {
             m_drawer = std::make_shared<vht::Drawer>(
                 m_data_loader,
                 m_window,
                 m_device,
                 m_swapchain,
+                m_shadow_render_pass,
+                m_shadow_pipeline,
                 m_render_pass,
                 m_graphics_pipeline,
                 m_command_pool,
