#pragma once #include #include "worldpass.h" #include "postpass.h" #include "dofpass.h" #include "imguipass.h" #include "skypass.h" #include "shadowpass.h" constexpr int numFrameResources = 2; struct RenderTarget { VkSurfaceKHR surface = nullptr; VkSwapchainKHR swapchain = nullptr; VkExtent2D extent = {}; uint32_t numImages = 0, imageIndex = 0, currentResource = 0; // swapwchain VkImage* swapchainImages = nullptr; VkImageView* swapchainImageViews = nullptr; VkFramebuffer* swapchainFramebuffers = nullptr; // offscreen color VkImage* offscreenColorImages = nullptr; VkDeviceMemory* offscreenColorMemory = nullptr; VkImageView* offscreenColorImageViews = nullptr; // offscreen depth VkImage* offscreenDepthImages = nullptr; VkDeviceMemory* offscreenDepthMemory = nullptr; VkImageView* offscreenDepthImageViews = nullptr; VkFramebuffer* offscreenFramebuffers = nullptr; // near field VkImage* nearFieldImages = nullptr; VkDeviceMemory* nearFieldMemory = nullptr; VkImageView* nearFieldImageViews = nullptr; VkFramebuffer* nearFieldFramebuffers = nullptr; // far field VkImage* farFieldImages = nullptr; VkDeviceMemory* farFieldMemory = nullptr; VkImageView* farFieldImageViews = nullptr; VkFramebuffer* farFieldFramebuffers = nullptr; VkCommandBuffer* commandBuffers = nullptr; VkSemaphore imageAvailableSemaphore = nullptr; VkSemaphore renderFinishedSemaphore = nullptr; VkFence* fences = nullptr; // imgui VkBuffer* imguiVertexBuffers = nullptr; VkDeviceMemory* imguiVertexMemorys = nullptr; size_t* imguiVertexBufferSizes = nullptr; VkBuffer* imguiIndexBuffers = nullptr; VkDeviceMemory* imguiIndexMemorys = nullptr; size_t* imguiIndexBufferSizes = nullptr; VkDescriptorSet* postSets = nullptr; VkDescriptorSet* dofSets = nullptr; }; struct GraphicsConfig { int shadowResolution, dofDownscale; bool vsync = true, filterPCF; }; class World; class Mesh; class Camera; class Material; class Renderer { public: Renderer(GraphicsConfig config); ~Renderer(); void render(World& world, Camera& camera, RenderTarget* target); RenderTarget* createSurfaceRenderTarget(VkSurfaceKHR surface, RenderTarget* oldTarget = nullptr); void destroyRenderTarget(RenderTarget* target); void takeScreenshot(const char* path, RenderTarget* target); VkShaderModule createShader(const char* path); void uploadImageData(VkImage image, int width, int height, VkDeviceSize size, void* src); uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); void fillMeshBuffers(Mesh* mesh); void destroyMeshBuffers(Mesh* mesh); void fillMaterialBuffers(Material* material); void destroyMaterialBuffers(Material* material); GraphicsConfig getConfig() const { return config_; } VkInstance getInstance() const { return instance_; } VkDevice getDevice() const { return device_; } VkQueue getGraphicsQueue() const { return graphicsQueue_; } VkCommandPool getCommandPool() const { return commandPool_; } VkRenderPass getRenderPass() const { return presentationRenderPass_; } VkDescriptorPool getDescriptorPool() const { return descriptorPool_; } VkDescriptorSetLayout getMaterialSetLayout() const { return materialSetLayout_; } WorldPass& getWorldPass() const { return *worldPass_; } ShadowPass& getShadowPass() const { return *shadowPass_; } private: void createInstance(); #ifdef DEBUG void createDebugMessenger(); #endif void createLogicalDevice(); void createCommandPool(); void createPresentationRenderPass(); void createDescriptorPool(); void createMaterialSetLayout(); GraphicsConfig config_; VkInstance instance_ = nullptr; #ifdef DEBUG bool enableDebug = false; PFN_vkCreateDebugUtilsMessengerEXT createMessenger_ = nullptr; PFN_vkDestroyDebugUtilsMessengerEXT destroyMessenger_ = nullptr; VkDebugUtilsMessengerEXT messenger_ = nullptr; #endif VkPhysicalDevice physicalDevice_ = nullptr; VkPhysicalDeviceMemoryProperties deviceMemoryProperties_ = {}; VkDevice device_ = nullptr; struct { uint32_t graphics = 0, presentation = 0; } queueIndices; VkQueue graphicsQueue_ = nullptr; VkCommandPool commandPool_ = nullptr; VkRenderPass presentationRenderPass_ = nullptr; VkDescriptorPool descriptorPool_ = nullptr; VkDescriptorSetLayout materialSetLayout_ = nullptr; WorldPass* worldPass_ = nullptr; PostPass* postPass_ = nullptr; DoFPass* dofPass_ = nullptr; #ifdef DEBUG ImGuiPass* imguiPass_ = nullptr; #endif SkyPass* skyPass_ = nullptr; ShadowPass* shadowPass_ = nullptr; };