public void Dispose()
        {
            // Clean up used Vulkan resources
            // Note : Inherited destructor cleans up resources stored in base class

            // Frame buffer

            // Color attachment
            vkDestroyImageView(device, offscreenPass.colorAttachment.view, null);
            vkDestroyImage(device, offscreenPass.colorAttachment.image, null);
            vkFreeMemory(device, offscreenPass.colorAttachment.mem, null);

            // Depth attachment
            vkDestroyImageView(device, offscreenPass.depthAttachment.view, null);
            vkDestroyImage(device, offscreenPass.depthAttachment.image, null);
            vkFreeMemory(device, offscreenPass.depthAttachment.mem, null);

            vkDestroyRenderPass(device, offscreenPass.renderPass, null);
            vkDestroySampler(device, offscreenPass.sampler, null);
            vkDestroyFramebuffer(device, offscreenPass.framebuffer, null);

            vkDestroyPipeline(device, pipelineRadialBlur, null);
            vkDestroyPipeline(device, pipelinePhongPass, null);
            vkDestroyPipeline(device, pipelineColorPass, null);
            vkDestroyPipeline(device, pipelineOffscreenDisplay, null);

            vkDestroyPipelineLayout(device, pipelineLayoutRadialBlur, null);
            vkDestroyPipelineLayout(device, pipelineLayoutScene, null);

            vkDestroyDescriptorSetLayout(device, setLayoutScene, null);
            vkDestroyDescriptorSetLayout(device, setLayoutRadialBlur, null);

            model.destroy();

            uniformBufferScene.destroy();
            uniformBufferBlurParams.destroy();

            VkCommandBuffer cmdBuffer;

            vkFreeCommandBuffers(device, cmdPool, 1, &cmdBuffer);
            offscreenPass.commandBuffer = cmdBuffer;
            vkDestroySemaphore(device, offscreenPass.semaphore, null);

            textures_gradient.destroy();
        }