diff --git a/src/render/render.cpp b/src/render/render.cpp index d44befe..d20f895 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -3,6 +3,25 @@ //#include "VulkanUtils.hpp" //#include "assetLoader.h" +#ifndef _VULKANFOUNDATION_H +#define _VULKANFOUNDATION_H +#include "vulkanFoundation.h" +#endif // !VULKANFOUNDATION_H + +#ifndef _RENDERGUI_H +#define _RENDERGUI_H +#include "renderUI.h" +#endif // !_RENDERGUI_H + +#ifndef _RENDERIO_H +#define _RENDERIO_H +#include "renderIO.h" +#endif // !RENDERIO_H + +#include "renderSetter.h" + +#include "PBR.h" + void PlumageRender::renderMain::initWindow(int Width, int Height) { @@ -22,7 +41,7 @@ void PlumageRender::renderMain::framebufferResizeCallback(GLFWwindow* window, in } -void PlumageRender::renderMain::prepare(Setter setter,PlumageGUI renderGUI,RenderInput renderInput,RenderOutput renderOutput,PBR::Material pbrMaterial,PluamgeVulkanBackend::VulkanFoundation vkFoundation,renderMain mainRender,UI* ui) +void PlumageRender::renderMain::prepare(Setter setter,PlumageGUI renderGUI,RenderInput renderInput,RenderOutput renderOutput,PBR::Material pbrMaterial,PlumageVulkanBackend::VulkanFoundation vkFoundation,renderMain mainRender,UI* ui) { //VulkanExampleBase::prepare(); @@ -62,10 +81,10 @@ void PlumageRender::renderMain::submitWork(VkCommandBuffer cmdBuffer, VkQueue qu submitInfo.pCommandBuffers = &cmdBuffer; VkFenceCreateInfo fenceInfo = vks::initializers::fenceCreateInfo(); VkFence fence; - VK_CHECK_RESULT(vkCreateFence(PluamgeVulkanBackend::VulkanFoundation::device, &fenceInfo, nullptr, &fence)); + VK_CHECK_RESULT(vkCreateFence(PlumageVulkanBackend::VulkanFoundation::device, &fenceInfo, nullptr, &fence)); VK_CHECK_RESULT(vkQueueSubmit(queue, 1, &submitInfo, fence)); - VK_CHECK_RESULT(vkWaitForFences(PluamgeVulkanBackend::VulkanFoundation::device, 1, &fence, VK_TRUE, UINT64_MAX)); - vkDestroyFence(PluamgeVulkanBackend::VulkanFoundation::device, fence, nullptr); + VK_CHECK_RESULT(vkWaitForFences(PlumageVulkanBackend::VulkanFoundation::device, 1, &fence, VK_TRUE, UINT64_MAX)); + vkDestroyFence(PlumageVulkanBackend::VulkanFoundation::device, fence, nullptr); } void PlumageRender::renderMain::submitToPresentQueue() @@ -74,7 +93,7 @@ void PlumageRender::renderMain::submitToPresentQueue() } -void PlumageRender::renderMain::render(Setter setter,PlumageGUI plumageGUI,UI* gui,renderMain mainRender,PluamgeVulkanBackend::VulkanFoundation vkFoundation,RenderInput renderInput,RenderOutput renderOutput) +void PlumageRender::renderMain::render(Setter setter,PlumageGUI plumageGUI,UI* gui,renderMain mainRender,PlumageVulkanBackend::VulkanFoundation vkFoundation,RenderInput renderInput,RenderOutput renderOutput) { if (!prepared) { return; @@ -82,7 +101,7 @@ void PlumageRender::renderMain::render(Setter setter,PlumageGUI plumageGUI,UI* g if (!setter.settings.headless) { - plumageGUI.updateUIOverlay(gui,setter,mainRender,vkFoundation,renderInput,renderOutput); + plumageGUI.updateUIOverlay(gui,setter,mainRender,vkFoundation,renderInput,renderOutput,); } uint32_t imageIndex; @@ -98,7 +117,7 @@ void PlumageRender::renderMain::render(Setter setter,PlumageGUI plumageGUI,UI* g // Update UBOs vkFoundation.updateUniformBuffers(camera,mainRender); - PluamgeVulkanBackend::VulkanFoundation::UniformBufferSet currentUB = vkFoundation.uniformBuffers[currentBuffer]; + PlumageVulkanBackend::VulkanFoundation::UniformBufferSet currentUB = vkFoundation.uniformBuffers[currentBuffer]; memcpy(currentUB.scene.mapped, &vkFoundation.shaderDataScene, sizeof(vkFoundation.shaderDataScene)); memcpy(currentUB.params.mapped, &PBR::Material::shaderData, sizeof(PBR::Material::shaderData)); memcpy(currentUB.skybox.mapped, &vkFoundation.shaderDataSkybox, sizeof(vkFoundation.shaderDataSkybox)); @@ -153,7 +172,7 @@ void PlumageRender::renderMain::renderLoop(GLFWwindow* window,Setter setter) drawFrame(); } } - vkDeviceWaitIdle(PluamgeVulkanBackend::VulkanFoundation::device); + vkDeviceWaitIdle(PlumageVulkanBackend::VulkanFoundation::device); } void PlumageRender::renderMain::drawFrame() @@ -175,6 +194,14 @@ void PlumageRender::renderMain::drawFrame() } } +void PlumageRender::renderMain::destroyModel(PlumageVulkanBackend::VulkanFoundation vkFoundation) +{ + models.scene.destroy(vkFoundation.device); + models.skybox.destroy(vkFoundation.device); +} + + + @@ -189,7 +216,7 @@ int main() PlumageRender::RenderInput renderInput; PlumageRender::Setter setter; PlumageRender::renderMain plumageRender; - PluamgeVulkanBackend::VulkanFoundation vkFoundation; + PlumageVulkanBackend::VulkanFoundation vkFoundation; UI* gui = new UI(vkFoundation.vulkanDevice, vkFoundation.renderPass, vkFoundation.graphicQueue, vkFoundation.pipelineCache, setter.settings.sampleCount); vkFoundation.initVulkan(); diff --git a/src/render/render.h b/src/render/render.h index e78cea3..63e2bcb 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -36,10 +36,7 @@ #include "GLFW/glfw3.h" #endif // !_GLFW3_H -#ifndef _VULKANFOUNDATION_H -#define _VULKANFOUNDATION_H -#include "vulkanFoundation.h" -#endif // !VULKANFOUNDATION_H + #ifndef _GLTFMODEL_H #define _GLTFMODEL_H @@ -48,20 +45,14 @@ -#ifndef _RENDERGUI_H -#define _RENDERGUI_H -#include "renderUI.h" -#endif // !_RENDERGUI_H + #ifndef _UI_HPP #define _UI_HPP #include "ui.hpp" #endif // !UI_HPP -#ifndef _RENDERIO_H -#define _RENDERIO_H -#include "renderIO.h" -#endif // !RENDERIO_H + #ifndef _VULKANDEVICE_HPP #define _VULKANDEVICE_HPP @@ -92,12 +83,22 @@ #define ENABLE_VALIDATION false -PluamgeVulkanBackend::VulkanFoundation vkFoundation; +namespace PlumageVulkanBackend +{ + class VulkanFoundation; +} + +namespace PBR +{ + class Material; +} namespace PlumageRender { - - + class RenderInput; + class RenderOutput; + class Setter; + class PlumageGUI; class renderMain { public: @@ -151,14 +152,15 @@ namespace PlumageRender void initWindow(int width, int height); static void framebufferResizeCallback(GLFWwindow* window, int width, int height); void windowResized(); - void prepare(Setter setter, PlumageGUI renderGUI, RenderInput renderInput, RenderOutput renderOutput, PBR::Material pbrMaterial, PluamgeVulkanBackend::VulkanFoundation vkFoundation, renderMain mainRender, UI* ui); + void prepare(Setter setter, PlumageGUI renderGUI, RenderInput renderInput, RenderOutput renderOutput, PBR::Material pbrMaterial, PlumageVulkanBackend::VulkanFoundation vkFoundation, renderMain mainRender, UI* ui); void setupCamera(Camera camera, Setter setter); void submitWork(VkCommandBuffer cmdBuffer, VkQueue queue); void submitToPresentQueue(); - virtual void render(Setter setter, PlumageGUI plumageGUI, UI* gui, renderMain mainRender, PluamgeVulkanBackend::VulkanFoundation vkFoundation, RenderInput renderInput, RenderOutput renderOutput); + virtual void render(Setter setter, PlumageGUI plumageGUI, UI* gui, renderMain mainRender, PlumageVulkanBackend::VulkanFoundation vkFoundation, RenderInput renderInput, RenderOutput renderOutput); void renderLoop(GLFWwindow* window, Setter setter); void drawFrame(); + void destroyModel(PlumageVulkanBackend::VulkanFoundation vkFoundation); private: @@ -175,8 +177,8 @@ namespace PlumageRender renderMain::~renderMain() { - models.scene.destroy(PluamgeVulkanBackend::VulkanFoundation::device); - models.skybox.destroy(PluamgeVulkanBackend::VulkanFoundation::device); + models.scene.destroy(PlumageVulkanBackend::VulkanFoundation::device); + models.skybox.destroy(PlumageVulkanBackend::VulkanFoundation::device); } diff --git a/src/render/renderUI.cpp b/src/render/renderUI.cpp index dd1b4c5..98653bf 100644 --- a/src/render/renderUI.cpp +++ b/src/render/renderUI.cpp @@ -1,8 +1,28 @@ #include "renderUI.h" +#ifndef _RENDER_H +#define _RENDER_H +#include "render.h" +#endif // !RENDER_H -void PlumageRender::PlumageGUI::updateUIOverlay(UI* gui,Setter& setter,renderMain mainRender,VulkanFoundation vkFoundation,RenderInput renderInput,RenderOutput& renderOutput) +#include "vulkanFoundation.h" + + +#ifndef _RENDERIO_H +#define _RENDERIO_H +#include "renderIO.h" +#endif // !RENDERIO_H + +#ifndef _RENDERSETTER_H +#define _RENDERSETTER_H +#include "renderSetter.h" +#endif // !RENDERSETTER_H + +#include "PBR.h" + + +void PlumageRender::PlumageGUI::updateUIOverlay(UI* gui,Setter& setter,renderMain mainRender, PlumageVulkanBackend::VulkanFoundation vkFoundation,RenderInput renderInput,RenderOutput& renderOutput,PBR::Material pbrMaterial) { @@ -60,9 +80,9 @@ void PlumageRender::PlumageGUI::updateUIOverlay(UI* gui,Setter& setter,renderMai std::wstring_convert> converter; std::string stringFilename = converter.to_bytes(filename); - renderInput.loadScene(stringFilename,vkFoundation); + renderInput.loadScene(stringFilename,mainRender,vkFoundation); - vkFoundation.createDescriptorSets(setter); + vkFoundation.createDescriptorSets(setter,mainRender); updateCBs = true; renderOutput.signal.imageSequenceOutputComplete = false; @@ -80,8 +100,8 @@ void PlumageRender::PlumageGUI::updateUIOverlay(UI* gui,Setter& setter,renderMai auto& environments = renderInput.environments; if (gui->combo(chineseUI.environmentMap, selectedEnvironment, environments)) { vkDeviceWaitIdle(vkFoundation.device); - renderInput.loadEnvironment(environments[selectedEnvironment]); - vkFoundation.createDescriptorSets(); + renderInput.loadEnvironment(environments[selectedEnvironment],pbrMaterial,setter,vkFoundation,mainRender); + vkFoundation.createDescriptorSets(setter,mainRender); updateCBs = true; } if (gui->checkbox(chineseUI.environmentBackGround, &setter.settings.displayBackground)) { @@ -134,7 +154,7 @@ void PlumageRender::PlumageGUI::updateUIOverlay(UI* gui,Setter& setter,renderMai } if (gui->beginMenu(chineseUI.menuAnimation)) { - if (PlumageRender::renderMain::models.scene.animations.size() > 0) + if (mainRender.models.scene.animations.size() > 0) { if (gui->beginMenu(chineseUI.menuAnimationActivation)) { @@ -211,12 +231,12 @@ void PlumageRender::PlumageGUI::updateUIOverlay(UI* gui,Setter& setter,renderMai } if (updateCBs) { - vkDeviceWaitIdle(PluamgeVulkanBackend::VulkanFoundation::device); - vkFoundation.createCommandBuffer(); - vkDeviceWaitIdle(PluamgeVulkanBackend::VulkanFoundation::device); + vkDeviceWaitIdle(vkFoundation.device); + vkFoundation.createCommandBuffer(setter,mainRender,gui); + vkDeviceWaitIdle(vkFoundation.device); } if (updateShaderParams) { - vkFoundation.createCommandBuffer(); + vkFoundation.createCommandBuffer(setter, mainRender, gui); } } \ No newline at end of file diff --git a/src/render/renderUI.h b/src/render/renderUI.h index eac4a17..a9d69ae 100644 --- a/src/render/renderUI.h +++ b/src/render/renderUI.h @@ -1,24 +1,6 @@ #pragma once -#ifndef _RENDER_H -#define _RENDER_H -#include "render.h" -#endif // !RENDER_H -#ifndef _VULKANFOUNDATION_H -#define _VULKANFOUNDATION_H -#include "vulkanFoundation.h" -#endif // !VULKANFOUNDATION_H - -#ifndef _RENDERIO_H -#define _RENDERIO_H -#include "renderIO.h" -#endif // !RENDERIO_H - -#ifndef _RENDERSETTER_H -#define _RENDERSETTER_H -#include "renderSetter.h" -#endif // !RENDERSETTER_H @@ -29,9 +11,22 @@ #include +namespace PlumageVulkanBackend +{ + class VulkanFoundation; +} + +namespace PBR +{ + class Material; +} namespace PlumageRender { + class Setter; + class RenderInput; + class RenderOutput; + class renderMain; class PlumageGUI { public: @@ -40,7 +35,7 @@ namespace PlumageRender - void updateUIOverlay(UI* gui,Setter& setter,renderMain mainRender, VulkanFoundation vkFoundation, RenderInput renderInput, RenderOutput& renderOutput); + void updateUIOverlay(UI* gui,Setter& setter,renderMain mainRender, PlumageVulkanBackend::VulkanFoundation vkFoundation, RenderInput renderInput, RenderOutput& renderOutput,PBR::Material pbrMaterial); struct DebugView { diff --git a/src/render/vulkanFoundation.cpp b/src/render/vulkanFoundation.cpp index 1ee0b7c..a76b253 100644 --- a/src/render/vulkanFoundation.cpp +++ b/src/render/vulkanFoundation.cpp @@ -1,7 +1,23 @@ #include "vulkanFoundation.h" -void PluamgeVulkanBackend::VulkanFoundation::initVulkan(PlumageRender::Setter setter,Camera camera,PlumageRender::renderMain mainRender,UI* plumageGUI) + +#ifndef _RENDERSETTER_H +#define _RENDERSETTER_H +#include "renderSetter.h" +#endif // !RENDERSETTER_H + +#ifndef _RENDER_H +#define _RENDER_H +#include "render.h" +#endif // !RENDER_H + +#ifndef _PBR_H +#define _PBR_H +#include "PBR.h" +#endif // !PBR_H + +void PlumageVulkanBackend::VulkanFoundation::initVulkan(PlumageRender::Setter setter,Camera camera,PlumageRender::renderMain mainRender,UI* plumageGUI) { // 创建instance createInstance(setter); @@ -54,7 +70,7 @@ void PluamgeVulkanBackend::VulkanFoundation::initVulkan(PlumageRender::Setter se createDescriptorPool(mainRender); // 创建资源描述符集 - createDescriptorSets(setter); + createDescriptorSets(setter,mainRender); // 分配命令缓存区 allocateCommandBuffers(setter); @@ -66,7 +82,7 @@ void PluamgeVulkanBackend::VulkanFoundation::initVulkan(PlumageRender::Setter se -void PluamgeVulkanBackend::VulkanFoundation::createInstance(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createInstance(PlumageRender::Setter setter) { // check validation layers if (setter.settings.validation && !checkValidationLayerSupport()) @@ -117,7 +133,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createInstance(PlumageRender::Sette } } -bool PluamgeVulkanBackend::VulkanFoundation::checkValidationLayerSupport() +bool PlumageVulkanBackend::VulkanFoundation::checkValidationLayerSupport() { uint32_t layerCount; vkEnumerateInstanceLayerProperties(&layerCount, nullptr); @@ -144,7 +160,7 @@ bool PluamgeVulkanBackend::VulkanFoundation::checkValidationLayerSupport() return true; } -std::vector PluamgeVulkanBackend::VulkanFoundation::getRequiredExtensions(PlumageRender::Setter setter) +std::vector PlumageVulkanBackend::VulkanFoundation::getRequiredExtensions(PlumageRender::Setter setter) { std::vector extensions; if (!setter.settings.headless) @@ -167,7 +183,7 @@ std::vector PluamgeVulkanBackend::VulkanFoundation::getRequiredExte -void PluamgeVulkanBackend::VulkanFoundation::setupDebugMessager(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::setupDebugMessager(PlumageRender::Setter setter) { if (!setter.settings.validation) { @@ -184,7 +200,7 @@ void PluamgeVulkanBackend::VulkanFoundation::setupDebugMessager(PlumageRender::S } } -void PluamgeVulkanBackend::VulkanFoundation::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo) +void PlumageVulkanBackend::VulkanFoundation::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugCreateInfo) { debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; @@ -198,7 +214,7 @@ void PluamgeVulkanBackend::VulkanFoundation::populateDebugMessengerCreateInfo(Vk debugCreateInfo.pUserData = nullptr; } // debugCallback用于校验层 -VKAPI_ATTR VkBool32 VKAPI_CALL PluamgeVulkanBackend::VulkanFoundation::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) +VKAPI_ATTR VkBool32 VKAPI_CALL PlumageVulkanBackend::VulkanFoundation::debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData) { { std::cerr << "validation layer: " << pCallbackData->pMessage << std::endl; @@ -207,7 +223,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL PluamgeVulkanBackend::VulkanFoundation::debugCall } } -VkResult PluamgeVulkanBackend::VulkanFoundation::CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) +VkResult PlumageVulkanBackend::VulkanFoundation::CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pDebugMessenger) { auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); @@ -223,7 +239,7 @@ VkResult PluamgeVulkanBackend::VulkanFoundation::CreateDebugUtilsMessengerEXT(Vk -void PluamgeVulkanBackend::VulkanFoundation::createSurface(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createSurface(PlumageRender::Setter setter) { if (setter.settings.headless) @@ -239,7 +255,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createSurface(PlumageRender::Setter -void PluamgeVulkanBackend::VulkanFoundation::pickPhysicalDevice(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::pickPhysicalDevice(PlumageRender::Setter setter) { uint32_t deviceCount = 0; @@ -271,7 +287,7 @@ void PluamgeVulkanBackend::VulkanFoundation::pickPhysicalDevice(PlumageRender::S } } -bool PluamgeVulkanBackend::VulkanFoundation::isDeviceSuitable(VkPhysicalDevice device,PlumageRender::Setter setter) +bool PlumageVulkanBackend::VulkanFoundation::isDeviceSuitable(VkPhysicalDevice device,PlumageRender::Setter setter) { if (setter.settings.headless) { @@ -291,7 +307,7 @@ bool PluamgeVulkanBackend::VulkanFoundation::isDeviceSuitable(VkPhysicalDevice d } } -bool PluamgeVulkanBackend::VulkanFoundation::checkDeviceExtensionSupport(VkPhysicalDevice device) +bool PlumageVulkanBackend::VulkanFoundation::checkDeviceExtensionSupport(VkPhysicalDevice device) { uint32_t extensionCount; vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr); @@ -310,7 +326,7 @@ bool PluamgeVulkanBackend::VulkanFoundation::checkDeviceExtensionSupport(VkPhysi } -PluamgeVulkanBackend::VulkanFoundation::QueueFamilyIndices PluamgeVulkanBackend::VulkanFoundation::findQueueFamilies(VkPhysicalDevice device,PlumageRender::Setter setter) +PlumageVulkanBackend::VulkanFoundation::QueueFamilyIndices PlumageVulkanBackend::VulkanFoundation::findQueueFamilies(VkPhysicalDevice device,PlumageRender::Setter setter) { QueueFamilyIndices indices; @@ -359,7 +375,7 @@ PluamgeVulkanBackend::VulkanFoundation::QueueFamilyIndices PluamgeVulkanBackend: return indices; } -PluamgeVulkanBackend::VulkanFoundation::SwapChainSupportDetails PluamgeVulkanBackend::VulkanFoundation::querySwapChainSupport(VkPhysicalDevice device) +PlumageVulkanBackend::VulkanFoundation::SwapChainSupportDetails PlumageVulkanBackend::VulkanFoundation::querySwapChainSupport(VkPhysicalDevice device) { // 获得surface细节 SwapChainSupportDetails details; @@ -389,7 +405,7 @@ PluamgeVulkanBackend::VulkanFoundation::SwapChainSupportDetails PluamgeVulkanBac -void PluamgeVulkanBackend::VulkanFoundation::createLogicalDevice(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createLogicalDevice(PlumageRender::Setter setter) { QueueFamilyIndices indices = findQueueFamilies(physicalDevice,setter); std::vector queueCreateInfos; @@ -469,7 +485,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createLogicalDevice(PlumageRender:: -void PluamgeVulkanBackend::VulkanFoundation::createSwapChain(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createSwapChain(PlumageRender::Setter setter) { if (setter.settings.headless) @@ -537,7 +553,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createSwapChain(PlumageRender::Sett swapChainExtent = extent; } -VkSurfaceFormatKHR PluamgeVulkanBackend::VulkanFoundation::chooseSwapSurfaceFormat(const std::vector& availableFormats) +VkSurfaceFormatKHR PlumageVulkanBackend::VulkanFoundation::chooseSwapSurfaceFormat(const std::vector& availableFormats) { for (const auto& availableFormat : availableFormats) { if (availableFormat.format == VK_FORMAT_B8G8R8_SRGB && availableFormat.colorSpace == VK_COLORSPACE_SRGB_NONLINEAR_KHR) @@ -549,7 +565,7 @@ VkSurfaceFormatKHR PluamgeVulkanBackend::VulkanFoundation::chooseSwapSurfaceForm return availableFormats[0]; } -VkPresentModeKHR PluamgeVulkanBackend::VulkanFoundation::chooseSwapPresentMode(const std::vector& availablePresentModes, PlumageRender::Setter setter) +VkPresentModeKHR PlumageVulkanBackend::VulkanFoundation::chooseSwapPresentMode(const std::vector& availablePresentModes, PlumageRender::Setter setter) { // Get available present modes uint32_t presentModeCount; @@ -582,7 +598,7 @@ VkPresentModeKHR PluamgeVulkanBackend::VulkanFoundation::chooseSwapPresentMode(c } } -VkExtent2D PluamgeVulkanBackend::VulkanFoundation::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities) +VkExtent2D PlumageVulkanBackend::VulkanFoundation::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities) { if (capabilities.currentExtent.width != std::numeric_limits::max()) { @@ -607,7 +623,7 @@ VkExtent2D PluamgeVulkanBackend::VulkanFoundation::chooseSwapExtent(const VkSurf -void PluamgeVulkanBackend::VulkanFoundation::createImageView(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createImageView(PlumageRender::Setter setter) { VkFormat colorAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; VkFormat depthFormat = findDepthFormat(); @@ -835,7 +851,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createImageView(PlumageRender::Sett -void PluamgeVulkanBackend::VulkanFoundation::createRenderPass(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createRenderPass(PlumageRender::Setter setter) { VkFormat colorAttachmentFormat; VkFormat depthAttachmentFormat = findDepthFormat(); @@ -1015,7 +1031,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createRenderPass(PlumageRender::Set } } -VkFormat PluamgeVulkanBackend::VulkanFoundation::findDepthFormat() +VkFormat PlumageVulkanBackend::VulkanFoundation::findDepthFormat() { return findSupportedFormat( { VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT }, @@ -1024,7 +1040,7 @@ VkFormat PluamgeVulkanBackend::VulkanFoundation::findDepthFormat() ); } -VkFormat PluamgeVulkanBackend::VulkanFoundation::findSupportedFormat(const std::vector& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) +VkFormat PlumageVulkanBackend::VulkanFoundation::findSupportedFormat(const std::vector& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) { for (VkFormat format : candidates) { @@ -1043,21 +1059,21 @@ VkFormat PluamgeVulkanBackend::VulkanFoundation::findSupportedFormat(const std:: throw std::runtime_error("failed to find supported format"); } -bool PluamgeVulkanBackend::VulkanFoundation::hasStencilComponent(VkFormat format) +bool PlumageVulkanBackend::VulkanFoundation::hasStencilComponent(VkFormat format) { return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT; } -void PluamgeVulkanBackend::VulkanFoundation::createDescriptorSetLayout() +void PlumageVulkanBackend::VulkanFoundation::createDescriptorSetLayout() { createSceneDescriptorSetLayout(); createMaterialDescriptorSetLayout(); createNodeDescriptorSetLayout(); } -void PluamgeVulkanBackend::VulkanFoundation::createSceneDescriptorSetLayout() +void PlumageVulkanBackend::VulkanFoundation::createSceneDescriptorSetLayout() { // scene,场景的资源描述符 std::vector setLayoutBindings = { @@ -1074,7 +1090,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createSceneDescriptorSetLayout() VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.scene)); } -void PluamgeVulkanBackend::VulkanFoundation::createMaterialDescriptorSetLayout() +void PlumageVulkanBackend::VulkanFoundation::createMaterialDescriptorSetLayout() { // 材质或材质采样器的资源描述符 std::vector setLayoutBindings = { @@ -1091,7 +1107,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createMaterialDescriptorSetLayout() VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.material)); } -void PluamgeVulkanBackend::VulkanFoundation::createNodeDescriptorSetLayout() +void PlumageVulkanBackend::VulkanFoundation::createNodeDescriptorSetLayout() { // 模型结点或矩阵的资源描述符 std::vector setLayoutBindings = { @@ -1106,7 +1122,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createNodeDescriptorSetLayout() -void PluamgeVulkanBackend::VulkanFoundation::createPipelineCache() +void PlumageVulkanBackend::VulkanFoundation::createPipelineCache() { VkPipelineCacheCreateInfo pipelineCacheCreateInfo{}; pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; @@ -1115,7 +1131,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createPipelineCache() -void PluamgeVulkanBackend::VulkanFoundation::createGraphicPipeline(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createGraphicPipeline(PlumageRender::Setter setter) { VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCI{}; inputAssemblyStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; @@ -1263,7 +1279,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createGraphicPipeline(PlumageRender -void PluamgeVulkanBackend::VulkanFoundation::createFramebuffer(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createFramebuffer(PlumageRender::Setter setter) { if (setter.settings.headless) @@ -1320,7 +1336,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createFramebuffer(PlumageRender::Se } } -void PluamgeVulkanBackend::VulkanFoundation::createSwapChainFramebuffer(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createSwapChainFramebuffer(PlumageRender::Setter setter) { uint32_t attachmentCount; VkImageView attachments[attachmentCount]; @@ -1364,7 +1380,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createSwapChainFramebuffer(PlumageR -void PluamgeVulkanBackend::VulkanFoundation::createCommandPool(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createCommandPool(PlumageRender::Setter setter) { QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice,setter); @@ -1383,7 +1399,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createCommandPool(PlumageRender::Se -void PluamgeVulkanBackend::VulkanFoundation::createUniformBuffer(PlumageRender::Setter setter,Camera camera,PlumageRender::renderMain mainRender) +void PlumageVulkanBackend::VulkanFoundation::createUniformBuffer(PlumageRender::Setter setter,Camera camera,PlumageRender::renderMain mainRender) { if (setter.settings.headless) { @@ -1403,7 +1419,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createUniformBuffer(PlumageRender:: updateUniformBuffers(camera,mainRender); } -void PluamgeVulkanBackend::VulkanFoundation::updateUniformBuffers(Camera camera, PlumageRender::renderMain mainRender) +void PlumageVulkanBackend::VulkanFoundation::updateUniformBuffers(Camera camera, PlumageRender::renderMain mainRender) { // Scene shaderDataScene.projection = camera.matrices.perspective; @@ -1432,7 +1448,7 @@ void PluamgeVulkanBackend::VulkanFoundation::updateUniformBuffers(Camera camera, shaderDataSkybox.model = glm::mat4(glm::mat3(camera.matrices.view)); } -void PluamgeVulkanBackend::VulkanFoundation::createDescriptorPool(PlumageRender::renderMain mainRender) +void PlumageVulkanBackend::VulkanFoundation::createDescriptorPool(PlumageRender::renderMain mainRender) { /* Descriptor Pool @@ -1469,7 +1485,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createDescriptorPool(PlumageRender: VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolCI, nullptr, &descriptorPool)); } -void PluamgeVulkanBackend::VulkanFoundation::createDescriptorSets(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createDescriptorSets(PlumageRender::Setter setter,PlumageRender::renderMain mainRender) { if (setter.settings.headless) { @@ -1481,14 +1497,14 @@ void PluamgeVulkanBackend::VulkanFoundation::createDescriptorSets(PlumageRender: descriptorSets.resize(swapChainImages.size()); } createSceneDescriptorSets(); - createMaterialDescriptorSets(); - createModelNodeDescriptorSets(); + createMaterialDescriptorSets(mainRender); + createModelNodeDescriptorSets(mainRender); createSkyboxDescriptorSets(); } // Scene (matrices and environment maps) -void PluamgeVulkanBackend::VulkanFoundation::createSceneDescriptorSets() +void PlumageVulkanBackend::VulkanFoundation::createSceneDescriptorSets() { for (auto i = 0; i < descriptorSets.size(); i++) @@ -1544,10 +1560,10 @@ void PluamgeVulkanBackend::VulkanFoundation::createSceneDescriptorSets() } // Per-Material descriptor sets -void PluamgeVulkanBackend::VulkanFoundation::createMaterialDescriptorSets() +void PlumageVulkanBackend::VulkanFoundation::createMaterialDescriptorSets(PlumageRender::renderMain mainRender) { - for (auto& material : PlumageRender::renderMain::models.scene.materials) + for (auto& material : mainRender.models.scene.materials) { VkDescriptorSetAllocateInfo descriptorSetAllocInfo{}; descriptorSetAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; @@ -1603,11 +1619,11 @@ void PluamgeVulkanBackend::VulkanFoundation::createMaterialDescriptorSets() } // Model node (matrices) -void PluamgeVulkanBackend::VulkanFoundation::createModelNodeDescriptorSets() +void PlumageVulkanBackend::VulkanFoundation::createModelNodeDescriptorSets(PlumageRender::renderMain mainRender) { // Per-Node descriptor set - for (auto& node : PlumageRender::renderMain::models.scene.nodes) + for (auto& node : mainRender.models.scene.nodes) { setupglTFNodeDescriptorSet(node); } @@ -1616,7 +1632,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createModelNodeDescriptorSets() // attention: gltf-spec -void PluamgeVulkanBackend::VulkanFoundation::setupglTFNodeDescriptorSet(glTFModel::Node* node) +void PlumageVulkanBackend::VulkanFoundation::setupglTFNodeDescriptorSet(glTFModel::Node* node) { if (node->mesh) { VkDescriptorSetAllocateInfo descriptorSetAllocInfo{}; @@ -1641,7 +1657,7 @@ void PluamgeVulkanBackend::VulkanFoundation::setupglTFNodeDescriptorSet(glTFMode } } -void PluamgeVulkanBackend::VulkanFoundation::createSkyboxDescriptorSets() +void PlumageVulkanBackend::VulkanFoundation::createSkyboxDescriptorSets() { // Skybox (fixed set) for (auto i = 0; i < uniformBuffers.size(); i++) { @@ -1681,7 +1697,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createSkyboxDescriptorSets() -void PluamgeVulkanBackend::VulkanFoundation::allocateCommandBuffers(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::allocateCommandBuffers(PlumageRender::Setter setter) { // resize if (setter.settings.headless) @@ -1702,7 +1718,7 @@ void PluamgeVulkanBackend::VulkanFoundation::allocateCommandBuffers(PlumageRende VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, commandbuffers.data())); } -void PluamgeVulkanBackend::VulkanFoundation::cleanupSwapChain() +void PlumageVulkanBackend::VulkanFoundation::cleanupSwapChain() { for (auto framebuffer : framebuffers) { @@ -1717,7 +1733,7 @@ void PluamgeVulkanBackend::VulkanFoundation::cleanupSwapChain() vkDestroySwapchainKHR(device, swapChain, nullptr); } -void PluamgeVulkanBackend::VulkanFoundation::createCommandBuffer(PlumageRender::Setter setter,PlumageRender::renderMain mainRender,UI* plumageGUI) +void PlumageVulkanBackend::VulkanFoundation::createCommandBuffer(PlumageRender::Setter setter,PlumageRender::renderMain mainRender,UI* plumageGUI) { VkCommandBufferBeginInfo cmdBufferBeginInfo{}; @@ -1807,7 +1823,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createCommandBuffer(PlumageRender:: } -void PluamgeVulkanBackend::VulkanFoundation::createglTFNodeCommandBuffer(glTFModel::Node* node, uint32_t cbIndex, glTFModel::Material::AlphaMode alphaMode) +void PlumageVulkanBackend::VulkanFoundation::createglTFNodeCommandBuffer(glTFModel::Node* node, uint32_t cbIndex, glTFModel::Material::AlphaMode alphaMode) { if (node->mesh) { // Render mesh primitives @@ -1886,7 +1902,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createglTFNodeCommandBuffer(glTFMod } } -void PluamgeVulkanBackend::VulkanFoundation::createFenceAndSemaphore(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::createFenceAndSemaphore(PlumageRender::Setter setter) { waitFences.resize(setter.settings.MaxFrameInFlight); presentCompleteSemaphores.resize(setter.settings.MaxFrameInFlight); @@ -1912,7 +1928,7 @@ void PluamgeVulkanBackend::VulkanFoundation::createFenceAndSemaphore(PlumageRend } } -void PluamgeVulkanBackend::VulkanFoundation::DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator) +void PlumageVulkanBackend::VulkanFoundation::DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator) { auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"); @@ -1924,7 +1940,7 @@ void PluamgeVulkanBackend::VulkanFoundation::DestroyDebugUtilsMessengerEXT(VkIns -bool PluamgeVulkanBackend::VulkanFoundation::acqureNextSwapchainImage(bool framebuffeerResized,uint32_t imageIndex,uint32_t frameIndex,PlumageRender::Setter setter) +bool PlumageVulkanBackend::VulkanFoundation::acqureNextSwapchainImage(bool framebuffeerResized,uint32_t imageIndex,uint32_t frameIndex,PlumageRender::Setter setter) { VkResult result = vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, renderCompleteSemaphores[frameIndex], VK_NULL_HANDLE, &imageIndex); @@ -1940,7 +1956,7 @@ bool PluamgeVulkanBackend::VulkanFoundation::acqureNextSwapchainImage(bool frame } } -void PluamgeVulkanBackend::VulkanFoundation::submitToGraphicQueue(uint32_t frameIndex, uint32_t currentBuffer) +void PlumageVulkanBackend::VulkanFoundation::submitToGraphicQueue(uint32_t frameIndex, uint32_t currentBuffer) { const VkPipelineStageFlags waitDstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSubmitInfo submitInfo{}; @@ -1955,7 +1971,7 @@ void PluamgeVulkanBackend::VulkanFoundation::submitToGraphicQueue(uint32_t frame VK_CHECK_RESULT(vkQueueSubmit(graphicQueue, 1, &submitInfo, waitFences[frameIndex])); } -void PluamgeVulkanBackend::VulkanFoundation::imageToQueuePresent(uint32_t frameIndex,uint32_t imageIndex,bool framebufferResized,PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::imageToQueuePresent(uint32_t frameIndex,uint32_t imageIndex,bool framebufferResized,PlumageRender::Setter setter) { //显示队列 VkSemaphore signalSemaphores[] = { renderCompleteSemaphores[frameIndex] }; @@ -1984,7 +2000,7 @@ void PluamgeVulkanBackend::VulkanFoundation::imageToQueuePresent(uint32_t frameI } } -void PluamgeVulkanBackend::VulkanFoundation::destroyPlumageRender(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::destroyPlumageRender(PlumageRender::Setter setter) { // Clean up Vulkan resources cleanupSwapChain(); @@ -2047,7 +2063,7 @@ void PluamgeVulkanBackend::VulkanFoundation::destroyPlumageRender(PlumageRender: -void PluamgeVulkanBackend::VulkanFoundation::updateShaderData() +void PlumageVulkanBackend::VulkanFoundation::updateShaderData() { PBR::Material::shaderData.lightDir = glm::vec4( sin(glm::radians(lightSource.rotation.x)) * cos(glm::radians(lightSource.rotation.y)), @@ -2056,7 +2072,7 @@ void PluamgeVulkanBackend::VulkanFoundation::updateShaderData() 0.0f); } -void PluamgeVulkanBackend::VulkanFoundation::recreateSwapChain(PlumageRender::Setter setter) +void PlumageVulkanBackend::VulkanFoundation::recreateSwapChain(PlumageRender::Setter setter) { int width = 0, height = 0; glfwGetFramebufferSize(window, &width, &height); diff --git a/src/render/vulkanFoundation.h b/src/render/vulkanFoundation.h index 9d7e44f..27a4f34 100644 --- a/src/render/vulkanFoundation.h +++ b/src/render/vulkanFoundation.h @@ -9,16 +9,11 @@ #include - #ifndef _GLTFMODEL_H #define _GLTFMODEL_H #include "glTFModel.h" #endif // !GLTFMODEL_H -#ifndef _RENDERSETTER_H -#define _RENDERSETTER_H -#include "renderSetter.h" -#endif // !RENDERSETTER_H #ifndef _GLFW3_H @@ -49,15 +44,17 @@ #define _UI_HPP #endif // !UI_HPP -#ifndef _RENDER_H -#define _RENDER_H -#include "render.h" -#endif // !RENDER_H - -PlumageRender::renderMain mainRender; -namespace PluamgeVulkanBackend + + +namespace PlumageRender +{ + class renderMain; + class Setter; +} + +namespace PlumageVulkanBackend { class VulkanFoundation { @@ -130,7 +127,7 @@ namespace PluamgeVulkanBackend void initVulkan(PlumageRender::Setter setter, Camera camera, PlumageRender::renderMain mainRender, UI* plumageGUI); // 创建描述符集合 - void createDescriptorSets(PlumageRender::Setter setter); + void createDescriptorSets(PlumageRender::Setter setter, PlumageRender::renderMain mainRender); void createCommandBuffer(PlumageRender::Setter setter, PlumageRender::renderMain mainRender, UI* plumageGUI); @@ -284,8 +281,8 @@ namespace PluamgeVulkanBackend void pickPhysicalDevice(PlumageRender::Setter setter); bool isDeviceSuitable(VkPhysicalDevice device, PlumageRender::Setter setter); bool checkDeviceExtensionSupport(VkPhysicalDevice device); - PluamgeVulkanBackend::VulkanFoundation::QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device, PlumageRender::Setter setter); - PluamgeVulkanBackend::VulkanFoundation::SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); + PlumageVulkanBackend::VulkanFoundation::QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device, PlumageRender::Setter setter); + PlumageVulkanBackend::VulkanFoundation::SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device); // 创建程序使用的逻辑设备 void createLogicalDevice(PlumageRender::Setter setter); @@ -337,8 +334,8 @@ namespace PluamgeVulkanBackend void createSceneDescriptorSets(); - void createMaterialDescriptorSets(); - void createModelNodeDescriptorSets(); + void createMaterialDescriptorSets(PlumageRender::renderMain mainRender); + void createModelNodeDescriptorSets(PlumageRender::renderMain mainRender); void setupglTFNodeDescriptorSet(glTFModel::Node* node); void createSkyboxDescriptorSets();