Archived
1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
graph/include/renderer.h

145 lines
3.6 KiB
C++

#pragma once
#include <vulkan/vulkan.h>
#include "worldpass.h"
#include "postpass.h"
#include "dofpass.h"
struct RenderTarget {
VkSurfaceKHR surface = nullptr;
VkSwapchainKHR swapchain = nullptr;
VkExtent2D extent = {};
uint32_t numImages = 0, currentImage = 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;
VkDescriptorSet* postSets = nullptr;
VkDescriptorSet* dofSets = nullptr;
};
class World;
class Mesh;
class Camera;
class Renderer {
public:
Renderer();
~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);
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
void fillMeshBuffers(Mesh* mesh);
void destroyMeshBuffers(Mesh* mesh);
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_;
}
private:
void createInstance();
#ifdef DEBUG
void createDebugMessenger();
#endif
void createLogicalDevice();
void createCommandPool();
void createPresentationRenderPass();
void createDescriptorPool();
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;
WorldPass* worldPass_ = nullptr;
PostPass* postPass_ = nullptr;
DoFPass* dofPass_ = nullptr;
};