From 83d35012e6d31bd7fa8b47e8a1d1836fdae5557f Mon Sep 17 00:00:00 2001 From: ink-soul Date: Mon, 8 Apr 2024 11:10:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AF=B9=E8=B1=A1=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=8C=96=E5=9C=A8render=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/vulkanexamplebase.cpp | 2 +- src/render/render.cpp | 205 +++++++++----------------------- src/render/render.h | 35 +++--- src/render/renderIO.cpp | 21 ++++ src/render/renderIO.h | 11 ++ src/render/renderSetter.h | 9 +- src/render/renderUI.cpp | 6 +- src/render/renderUI.h | 4 +- src/render/vulkanFoundation.cpp | 170 +++++++++++++------------- src/render/vulkanFoundation.h | 25 ++-- 10 files changed, 214 insertions(+), 274 deletions(-) diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index 35b47df..dff366c 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -37,7 +37,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageCallback(VkDebugReportFlagsEXT flags, /* VkResult VulkanExampleBase::createInstance(bool enableValidation) { - setter.settings.validation = enableValidation; + PlumageRender::Setter::settings.validation = enableValidation; // Validation can also be forced via a define #if defined(_VALIDATION) diff --git a/src/render/render.cpp b/src/render/render.cpp index 74cf2ff..5bccf20 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -42,7 +42,7 @@ void PlumageRender::renderMain::buildCommandBuffers() cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; VkClearValue clearValues[3]; - if (setter.settings.multiSampling) { + if (PlumageRender::Setter::settings.multiSampling) { clearValues[0].color = { { 0.0f, 0.0f, 0.0f, 1.0f } }; clearValues[1].color = { { 0.0f, 0.0f, 0.0f, 1.0f } }; clearValues[2].depthStencil = { 1.0f, 0 }; @@ -57,9 +57,9 @@ void PlumageRender::renderMain::buildCommandBuffers() renderPassBeginInfo.renderPass = renderPass; renderPassBeginInfo.renderArea.offset.x = 0; renderPassBeginInfo.renderArea.offset.y = 0; - renderPassBeginInfo.renderArea.extent.width = setter.settings.width; - renderPassBeginInfo.renderArea.extent.height = setter.settings.height; - renderPassBeginInfo.clearValueCount = setter.settings.multiSampling ? 3 : 2; + renderPassBeginInfo.renderArea.extent.width =PlumageRender::renderMain::settings.width; + renderPassBeginInfo.renderArea.extent.height =PlumageRender::renderMain::settings.height; + renderPassBeginInfo.clearValueCount =PlumageRender::renderMain::settings.multiSampling ? 3 : 2; renderPassBeginInfo.pClearValues = clearValues; @@ -73,14 +73,14 @@ void PlumageRender::renderMain::buildCommandBuffers() vkCmdBeginRenderPass(currentCB, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); VkViewport viewport{}; - viewport.width = (float)setter.settings.width; - viewport.height = (float)setter.settings.height; + viewport.width = (float)PlumageRender::Setter::settings.width; + viewport.height = (float)PlumageRender::Setter::settings.height; viewport.minDepth = 0.0f; viewport.maxDepth = 1.0f; vkCmdSetViewport(currentCB, 0, 1, &viewport); VkRect2D scissor{}; - scissor.extent = { setter.settings.width, setter.settings.height }; + scissor.extent = {PlumageRender::renderMain::settings.width,PlumageRender::renderMain::settings.height }; vkCmdSetScissor(currentCB, 0, 1, &scissor); VkDeviceSize offsets[1] = { 0 }; @@ -115,7 +115,7 @@ void PlumageRender::renderMain::buildCommandBuffers() } // User interface - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { gui->draw(currentCB); } @@ -128,24 +128,12 @@ void PlumageRender::renderMain::buildCommandBuffers() } -void PlumageRender::renderMain::loadScene(std::string filename) - { - std::cout << "Loading scene from " << filename << std::endl; - models.scene.destroy(device); - animationIndex = 0; - animationTimer = 0.0f; - auto tStart = std::chrono::high_resolution_clock::now(); - models.scene.loadFromFile(filename, vulkanDevice, queue); - auto tFileLoad = std::chrono::duration(std::chrono::high_resolution_clock::now() - tStart).count(); - std::cout << "Loading took " << tFileLoad << " ms" << std::endl; - camera.setPosition({ 0.0f, 0.0f, -1.0f }); - camera.setRotation({ 0.0f, 0.0f, 0.0f }); - } + void PlumageRender::renderMain::loadEnvironment(std::string filename) { std::cout << "Loading environment from " << filename << std::endl; - if (textures.environmentCube.image) { + if (PlumageRender::renderMain::pbrmaterial.textures.environmentCube.image) { textures.environmentCube.destroy(); textures.irradianceCube.destroy(); textures.prefilteredCube.destroy(); @@ -172,13 +160,13 @@ void PlumageRender::renderMain::loadAssets() readDirectory(assetpath + "environments", "*.ktx", environments, false); - textures.empty.loadFromFile(setter.filePath.emptyEnvmapFilePath, VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); + textures.empty.loadFromFile(PlumageRender::Setter::filePath.emptyEnvmapFilePath, VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); - std::string sceneFile = setter.filePath.glTFModelFilePath; - std::string envMapFile = setter.filePath.envMapFilePath; + std::string sceneFile =PlumageRender::renderMain::filePath.glTFModelFilePath; + std::string envMapFile =PlumageRender::renderMain::filePath.envMapFilePath; loadScene(sceneFile.c_str()); - models.skybox.loadFromFile(setter.filePath.skyboxModleFilePath, vulkanDevice, queue); + models.skybox.loadFromFile(PlumageRender::Setter::filePath.skyboxModleFilePath, vulkanDevice, queue); loadEnvironment(envMapFile.c_str()); } @@ -191,76 +179,6 @@ void PlumageRender::renderMain::setupNodeDescriptorSet(glTFModel::Node* node) } -void PlumageRender::renderMain::setupDescriptors() - { - - - /* - Descriptor sets - */ - - // Scene (matrices and environment maps) - { - - - for (auto i = 0; i < descriptorSets.size(); i++) { - - VkDescriptorSetAllocateInfo descriptorSetAllocInfo{}; - descriptorSetAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorSetAllocInfo.descriptorPool = descriptorPool; - descriptorSetAllocInfo.pSetLayouts = &descriptorSetLayouts.scene; - descriptorSetAllocInfo.descriptorSetCount = 1; - VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &descriptorSetAllocInfo, &descriptorSets[i].scene)); - - std::array writeDescriptorSets{}; - - writeDescriptorSets[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSets[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - writeDescriptorSets[0].descriptorCount = 1; - writeDescriptorSets[0].dstSet = descriptorSets[i].scene; - writeDescriptorSets[0].dstBinding = 0; - writeDescriptorSets[0].pBufferInfo = &uniformBuffers[i].scene.descriptor; - - writeDescriptorSets[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSets[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - writeDescriptorSets[1].descriptorCount = 1; - writeDescriptorSets[1].dstSet = descriptorSets[i].scene; - writeDescriptorSets[1].dstBinding = 1; - writeDescriptorSets[1].pBufferInfo = &uniformBuffers[i].params.descriptor; - - writeDescriptorSets[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSets[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writeDescriptorSets[2].descriptorCount = 1; - writeDescriptorSets[2].dstSet = descriptorSets[i].scene; - writeDescriptorSets[2].dstBinding = 2; - writeDescriptorSets[2].pImageInfo = &textures.irradianceCube.descriptor; - - writeDescriptorSets[3].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSets[3].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writeDescriptorSets[3].descriptorCount = 1; - writeDescriptorSets[3].dstSet = descriptorSets[i].scene; - writeDescriptorSets[3].dstBinding = 3; - writeDescriptorSets[3].pImageInfo = &textures.prefilteredCube.descriptor; - - writeDescriptorSets[4].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSets[4].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writeDescriptorSets[4].descriptorCount = 1; - writeDescriptorSets[4].dstSet = descriptorSets[i].scene; - writeDescriptorSets[4].dstBinding = 4; - writeDescriptorSets[4].pImageInfo = &textures.lutBrdf.descriptor; - - vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); - } - } - - // Material (samplers) - { - - - - - } - } // generate two cube maps // irradiance cube map @@ -591,13 +509,13 @@ void PlumageRender::renderMain::generateCubemaps() pipelineCI.pStages = shaderStages.data(); pipelineCI.renderPass = renderpass; - shaderStages[0] = loadShader(device, setter.filePath.filterVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT); + shaderStages[0] = loadShader(device,PlumageRender::renderMain::filePath.filterVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT); switch (target) { case IRRADIANCE: - shaderStages[1] = loadShader(device, setter.filePath.irradianceFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT); + shaderStages[1] = loadShader(device,PlumageRender::renderMain::filePath.irradianceFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT); break; case PREFILTEREDENV: - shaderStages[1] = loadShader(device, setter.filePath.prefilterEnvmapFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT); + shaderStages[1] = loadShader(device,PlumageRender::renderMain::filePath.prefilterEnvmapFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT); break; }; VkPipeline pipeline; @@ -1002,8 +920,8 @@ void PlumageRender::renderMain::generateBRDFLUT() // Look-up-table (from BRDF) pipeline shaderStages = { - loadShader(device,setter.filePath.brdfVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT), - loadShader(device,setter.filePath.brdfFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT) + loadShader(device,PlumageRender::Setter::filePath.brdfVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT), + loadShader(device,PlumageRender::Setter::filePath.brdfFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT) }; VkPipeline pipeline; VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipeline)); @@ -1064,15 +982,6 @@ void PlumageRender::renderMain::generateBRDFLUT() // Prepare and initialize uniform buffer containing shader uniforms -void PlumageRender::renderMain::prepareUniformBuffers() - { - for (auto& uniformBuffer : uniformBuffers) { - uniformBuffer.scene.create(vulkanDevice, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(shaderDataScene)); - uniformBuffer.skybox.create(vulkanDevice, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(shaderDataSkybox)); - uniformBuffer.params.create(vulkanDevice, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, sizeof(shaderData)); - } - updateUniformBuffers(); - } // 更新统一缓冲区 done void PlumageRender::renderMain::updateUniformBuffers() @@ -1134,9 +1043,9 @@ void PlumageRender::renderMain::prepare() prepareUniformBuffers(); setupDescriptors(); preparePipelines(); - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { - gui = new UI(vulkanDevice, renderPass, queue, pipelineCache, setter.settings.sampleCount); + gui = new UI(vulkanDevice, renderPass, queue, pipelineCache,PlumageRender::renderMain::settings.sampleCount); updateUIOverlay(); } buildCommandBuffers(); @@ -1148,7 +1057,7 @@ void PlumageRender::renderMain::setupCamera() { camera.type = Camera::CameraType::lookat; - camera.setPerspective(45.0f, (float)setter.settings.width / (float)setter.settings.height, 0.1f, 256.0f); + camera.setPerspective(45.0f, (float)PlumageRender::Setter::settings.width / (float)PlumageRender::Setter::settings.height, 0.1f, 256.0f); camera.rotationSpeed = 0.25f; camera.movementSpeed = 0.1f; camera.setPosition({ 0.0f, 0.0f, -1.0f }); @@ -1201,8 +1110,8 @@ void PlumageRender::renderMain::writeImageToFile(std::string filePath) imageCreateCI.imageType = VK_IMAGE_TYPE_2D; // Note that vkCmdBlitImage (if supported) will also do format conversions if the swapchain color format would differ imageCreateCI.format = VK_FORMAT_R8G8B8A8_UNORM; - imageCreateCI.extent.width = setter.settings.width; - imageCreateCI.extent.height = setter.settings.height; + imageCreateCI.extent.width =PlumageRender::renderMain::settings.width; + imageCreateCI.extent.height =PlumageRender::renderMain::settings.height; imageCreateCI.extent.depth = 1; imageCreateCI.arrayLayers = 1; imageCreateCI.mipLevels = 1; @@ -1257,8 +1166,8 @@ void PlumageRender::renderMain::writeImageToFile(std::string filePath) { // Define the region to blit (we will blit the whole swapchain image) VkOffset3D blitSize; - blitSize.x = setter.settings.width; - blitSize.y = setter.settings.height; + blitSize.x =PlumageRender::renderMain::settings.width; + blitSize.y =PlumageRender::renderMain::settings.height; blitSize.z = 1; VkImageBlit imageBlitRegion{}; imageBlitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; @@ -1285,8 +1194,8 @@ void PlumageRender::renderMain::writeImageToFile(std::string filePath) imageCopyRegion.srcSubresource.layerCount = 1; imageCopyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; imageCopyRegion.dstSubresource.layerCount = 1; - imageCopyRegion.extent.width = setter.settings.width; - imageCopyRegion.extent.height = setter.settings.height; + imageCopyRegion.extent.width =PlumageRender::renderMain::settings.width; + imageCopyRegion.extent.height =PlumageRender::renderMain::settings.height; imageCopyRegion.extent.depth = 1; // Issue the copy command @@ -1310,7 +1219,7 @@ void PlumageRender::renderMain::writeImageToFile(std::string filePath) VK_PIPELINE_STAGE_TRANSFER_BIT, VkImageSubresourceRange{ VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }); - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { // Transition back the swap chain image after the blit is done vks::tools::insertImageMemoryBarrier( @@ -1347,16 +1256,16 @@ void PlumageRender::renderMain::writeImageToFile(std::string filePath) colorSwizzle = (std::find(formatsBGR.begin(), formatsBGR.end(), swapChain.colorFormat) != formatsBGR.end()); } - if (setter.settings.outputPNGimage) + if (PlumageRender::Setter::settings.outputPNGimage) { if (colorSwizzle) { // 暂时不改,此处需要将BGR通道改成RGB格式 - stbi_write_png(filePath.c_str(), setter.settings.width, setter.settings.height, 4, data, static_cast(subResourceLayout.rowPitch)); + stbi_write_png(filePath.c_str(),PlumageRender::renderMain::settings.width,PlumageRender::renderMain::settings.height, 4, data, static_cast(subResourceLayout.rowPitch)); } else { - stbi_write_png(filePath.c_str(), setter.settings.width, setter.settings.height, 4, data, static_cast(subResourceLayout.rowPitch)); + stbi_write_png(filePath.c_str(),PlumageRender::renderMain::settings.width,PlumageRender::renderMain::settings.height, 4, data, static_cast(subResourceLayout.rowPitch)); } } @@ -1366,13 +1275,13 @@ void PlumageRender::renderMain::writeImageToFile(std::string filePath) std::ofstream file(filePath, std::ios::out | std::ios::binary); // ppm header - file << "P6\n" << setter.settings.width << "\n" << setter.settings.height << "\n" << 255 << "\n"; + file << "P6\n" < setter.settings.endFrameIndex) + if (savedFrameCounter >PlumageRender::renderMain::settings.endFrameIndex) { // 避免重复改变为true带来的无效性能开销 if (signal.imageSequenceOutputComplete) @@ -1425,20 +1334,20 @@ void PlumageRender::renderMain::outputImageSequence() signal.imageSequenceOutputComplete = true; // 构造ffmpeg脚本需要的路径变量(提前到配置) std::string fileName = "/%dresult.ppm"; - setter.filePath.totalImageOutputPath = setter.filePath.deviceSpecFilePath + fileName; + PlumageRender::Setter::filePath.totalImageOutputPath =PlumageRender::renderMain::filePath.deviceSpecFilePath + fileName; return; } // 路径存在性检查,不存在则创建 - if (!std::filesystem::exists(setter.filePath.deviceSpecFilePath.c_str())) + if (!std::filesystem::exists(PlumageRender::Setter::filePath.deviceSpecFilePath.c_str())) { - std::filesystem::create_directories(setter.filePath.deviceSpecFilePath.c_str()); + std::filesystem::create_directories(PlumageRender::Setter::filePath.deviceSpecFilePath.c_str()); } // 拼接图片序列编号到路径里 std::string fileName ="/" + std::to_string(savedFrameCounter) + "result.ppm"; - setter.filePath.totalImageOutputPath = setter.filePath.deviceSpecFilePath + fileName; + PlumageRender::Setter::filePath.totalImageOutputPath =PlumageRender::renderMain::filePath.deviceSpecFilePath + fileName; //std::cout << outputPath << std::endl; // 写入文件 - writeImageToFile(setter.filePath.totalImageOutputPath.c_str()); + writeImageToFile(PlumageRender::Setter::filePath.totalImageOutputPath.c_str()); // 写入一帧后已保存帧数+1 savedFrameCounter++; } @@ -1456,7 +1365,7 @@ void PlumageRender::renderMain::imageSequenceToVideo() return; } // 拼接视频保存的设备编号路径(提前到配置文件进行) - std::string deviceFilePath = setter.filePath.videoOutputPath + "/device" + std::to_string(selectedPhysicalDeviceIndex); + std::string deviceFilePath =PlumageRender::renderMain::filePath.videoOutputPath + "/device" + std::to_string(selectedPhysicalDeviceIndex); // 判断路径是否存在,不存在则创建 if (std::filesystem::exists(deviceFilePath.c_str())) { @@ -1465,12 +1374,12 @@ void PlumageRender::renderMain::imageSequenceToVideo() // 构造结果视频路径 std::string resultVideoPath = deviceFilePath + "/result.mp4"; // 构造脚本需要参数,图片序列路径和设定的帧率 - std::string commandLineImageSequencePath = setter.filePath.totalImageOutputPath; + std::string commandLineImageSequencePath =PlumageRender::renderMain::filePath.totalImageOutputPath; //std::string commandLineCodecAndResultPath = resultVideoPath; - std::string commandLineFrameRate = std::to_string(setter.settings.videoFrameRate); + std::string commandLineFrameRate = std::to_string(PlumageRender::renderMain::settings.videoFrameRate); // 根据不同系统使用不同脚本 #if defined(_WIN32) - std::string commandLine = setter.filePath.image2videoBatFilePath + " " + commandLineFrameRate + " " + commandLineImageSequencePath + " " + resultVideoPath; + std::string commandLine =PlumageRender::renderMain::filePath.image2videoBatFilePath + " " + commandLineFrameRate + " " + commandLineImageSequencePath + " " + resultVideoPath; #else std::string commandLine = filePath.image2videoShFilePath + " " + commandLineFrameRate + " " + commandLineImageSequencePath + " " + resultVideoPath; #endif @@ -1486,7 +1395,7 @@ void PlumageRender::renderMain::imageSequenceToVideo() void PlumageRender::renderMain::removeImageSequence() { // 函数非第一次运行的边界条件 - if (savedFrameCounter != setter.settings.startFrameCount) + if (savedFrameCounter !=PlumageRender::renderMain::settings.startFrameCount) { // 检查视频输出完成的标志位 if (!signal.imageSequenceToVideoComplete) @@ -1496,9 +1405,9 @@ void PlumageRender::renderMain::removeImageSequence() } // 遍历删除图片序列文件和空文件夹 - if (std::filesystem::exists(setter.filePath.deviceSpecFilePath)) + if (std::filesystem::exists(PlumageRender::Setter::filePath.deviceSpecFilePath)) { - for (const auto& entry : std::filesystem::directory_iterator(setter.filePath.deviceSpecFilePath)) + for (const auto& entry : std::filesystem::directory_iterator(PlumageRender::Setter::filePath.deviceSpecFilePath)) { if (std::filesystem::is_directory(entry.path())) { @@ -1509,7 +1418,7 @@ void PlumageRender::renderMain::removeImageSequence() std::filesystem::remove(entry.path()); } } - std::filesystem::remove(setter.filePath.deviceSpecFilePath); + std::filesystem::remove(PlumageRender::Setter::filePath.deviceSpecFilePath); std::cout << "clean up complete" << std::endl; } return; @@ -1524,7 +1433,7 @@ void PlumageRender::renderMain::render() return; } - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { updateUIOverlay(); } @@ -1587,7 +1496,7 @@ void PlumageRender::renderMain::render() frameIndex %= renderAhead; if (!paused) { - if (setter.settings.rotateModel) { + if (PlumageRender::Setter::settings.rotateModel) { modelrot.y += frameTimer * 35.0f; if (modelrot.y > 360.0f) { modelrot.y -= 360.0f; @@ -1601,7 +1510,7 @@ void PlumageRender::renderMain::render() models.scene.updateAnimation(animationIndex, animationTimer); } updateShaderData(); - if (setter.settings.rotateModel) { + if (PlumageRender::Setter::settings.rotateModel) { updateUniformBuffers(); } } @@ -1648,7 +1557,7 @@ PlumageRender* plumageRender; plumageRender = new PlumageRender(); plumageRender->initVulkan(); - if (!plumageRender->setter.settings.headless) + if (!plumageRender->PlumageRender::Setter::settings.headless) { plumageRender->setupWindow(hInstance, WndProc); } @@ -1664,9 +1573,9 @@ int main() { PlumageRender::renderMain* plumageRender; PlumageRender::Setter setter; - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { - plumageRender->initWindow(setter.settings.width, setter.settings.height); + plumageRender->initWindow(PlumageRender::Setter::settings.width,PlumageRender::renderMain::settings.height); } plumageRender->initVulkan(); diff --git a/src/render/render.h b/src/render/render.h index afed5d9..3303a48 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -26,6 +26,7 @@ #include #include "renderSetter.h" #include "vulkanFoundation.h" +#include "camera.hpp" #define STB_IMAGE_WRITE_IMPLEMENTATION #include "stb_image_write.h" @@ -40,42 +41,36 @@ namespace PlumageRender GLFWwindow* window; + static VulkanBackend::VulkanFoundation vkFoundation; + static PlumageRender::Setter::Settings settings; + static PlumageRender::Setter::FilePath filePath; + static PBR::Material pbrmaterial; + static PlumageRender::RenderInput renderInput; + static PlumageRender::RenderOutput renderOutput; + static Camera camera; - PlumageRender::Setter setter; - - bool wireframe = false; - bool normalMapping = true; - bool ToneMapping = true; - bool pbrEnabled = true; + struct Models + { + glTFModel::Model scene; + glTFModel::Model skybox; + }; + static Models models; struct stat { } info; - - - glm::vec3 modelrot = glm::vec3(0.0f); glm::vec3 modelPos = glm::vec3(0.0f); - - - - - uint32_t frameIndex = 0; //VkImage swapChainImage; - int32_t animationIndex = 0; - float animationTimer = 0.0f; - bool animate = true; - - struct LightSource { glm::vec3 color = glm::vec3(1.0f); @@ -108,7 +103,7 @@ namespace PlumageRender UI* gui; - uint64_t savedFrameCounter = setter.settings.startFrameCount; + uint64_t savedFrameCounter = settings.startFrameCount; bool framebufferResized = false; diff --git a/src/render/renderIO.cpp b/src/render/renderIO.cpp index e69de29..37af4cb 100644 --- a/src/render/renderIO.cpp +++ b/src/render/renderIO.cpp @@ -0,0 +1,21 @@ +#include "renderIO.h" + +void PlumageRender::RenderInput::loadScene() +{ + std::string filename = PlumageRender::renderMain::filePath.glTFModelFilePath; + std::cout << "Loading scene from " << filename << std::endl; + PlumageRender::renderMain::models.scene.destroy(PlumageRender::renderMain::vkFoundation.device); + animationIndex = 0; + animationTimer = 0.0f; + auto tStart = std::chrono::high_resolution_clock::now(); + PlumageRender::renderMain::models.scene.loadFromFile(filename, PlumageRender::renderMain::vkFoundation.vulkanDevice, PlumageRender::renderMain::vkFoundation.graphicQueue); + auto tFileLoad = std::chrono::duration(std::chrono::high_resolution_clock::now() - tStart).count(); + std::cout << "Loading took " << tFileLoad << " ms" << std::endl; + PlumageRender::renderMain::camera.setPosition({ 0.0f, 0.0f, -1.0f }); + PlumageRender::renderMain::camera.setRotation({ 0.0f, 0.0f, 0.0f }); +} + +void PlumageRender::RenderInput::loadEnvironment(std::string fileName) +{ + +} diff --git a/src/render/renderIO.h b/src/render/renderIO.h index 93021c8..62260c0 100644 --- a/src/render/renderIO.h +++ b/src/render/renderIO.h @@ -3,6 +3,8 @@ #include #include +#include "render.h" + namespace PlumageRender { class RenderInput @@ -23,7 +25,16 @@ namespace PlumageRender std::map scenes; std::string selectedScene = "DamagedHelmet"; + void loadScene(); + + void loadEnvironment(std::string fileName); + + private: + + int32_t animationIndex = 0; + float animationTimer = 0.0f; + }; diff --git a/src/render/renderSetter.h b/src/render/renderSetter.h index 295aeb7..bc8b29b 100644 --- a/src/render/renderSetter.h +++ b/src/render/renderSetter.h @@ -32,6 +32,7 @@ namespace PlumageRender bool headless = true; // 无头开关 bool outputPNGimage = false; // 输出图片序列格式为PNG(四通道) bool enableSaveToImageSequeue = false; // 图片序列开关(暂时弃用) + bool animate = true; // 动画开关 uint32_t MaxFrameInFlight = 2; // 最大并行渲染帧数(通常为2,此时CPU和GPU并行处理) uint32_t endFrameIndex = 75; // 图片序列结束帧 bool enableIMGUI = false; // gui使用imgui @@ -40,7 +41,8 @@ namespace PlumageRender uint32_t selectedPhysicalDeviceIndex = 0; VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_4_BIT; // 多重采样倍率 - } settings; + }settings; + struct FilePath { @@ -98,12 +100,15 @@ namespace PlumageRender std::string image2videoBatFilePath = getAssetPath() + "script/image2video.bat"; std::string image2videoShFilePath = getAssetPath() + "script/image2video.sh"; - } filePath; + }filePath; + private: void getSettingFromCommandLine(); + + }; Setter::Setter() diff --git a/src/render/renderUI.cpp b/src/render/renderUI.cpp index 52f300d..4ce8c78 100644 --- a/src/render/renderUI.cpp +++ b/src/render/renderUI.cpp @@ -7,7 +7,7 @@ void PlumageRender::PlumageGUI::updateUIOverlay() ImGuiIO& io = ImGui::GetIO(); ImVec2 lastDisplaySize = io.DisplaySize; - io.DisplaySize = ImVec2((float)setter.settings.width, (float)setter.settings.height); + io.DisplaySize = ImVec2((float)PlumageRender::renderMain::settings.width, (float)PlumageRender::renderMain::settings.height); io.DeltaTime = frameTimer; io.MousePos = ImVec2(mousePos.x, mousePos.y); @@ -58,7 +58,7 @@ void PlumageRender::PlumageGUI::updateUIOverlay() std::wstring_convert> converter; std::string stringFilename = converter.to_bytes(filename); loadScene(stringFilename); - setupDescriptors(); + PlumageRender::renderMain::vkFoundation.createDescriptorSets(); updateCBs = true; PlumageRender::RenderInput::signal.imageSequenceOutputComplete = false; PlumageRender::RenderInput::signal.imageSequenceToVideoComplete = false; @@ -77,7 +77,7 @@ void PlumageRender::PlumageGUI::updateUIOverlay() setupDescriptors(); updateCBs = true; } - if (gui->checkbox(chineseUI.environmentBackGround, &setter.settings.displayBackground)) { + if (gui->checkbox(chineseUI.environmentBackGround, &PlumageRender::Setter::settings.displayBackground)) { updateShaderParams = true; } if (gui->slider("Exposure", &VulkanBackend::VulkanFoundation::shaderData.exposure, 0.1f, 10.0f)) { diff --git a/src/render/renderUI.h b/src/render/renderUI.h index 5ad06c1..a4baa34 100644 --- a/src/render/renderUI.h +++ b/src/render/renderUI.h @@ -3,10 +3,10 @@ #include "ui.hpp" #include "VulkanDevice.hpp" -#include "vulkanFoundation.h" + #include "renderSetter.h" #include "renderIO.h" - +#include "render.h" namespace PlumageRender { class PlumageGUI diff --git a/src/render/vulkanFoundation.cpp b/src/render/vulkanFoundation.cpp index e65c2a9..b35abc9 100644 --- a/src/render/vulkanFoundation.cpp +++ b/src/render/vulkanFoundation.cpp @@ -65,7 +65,7 @@ void VulkanBackend::VulkanFoundation::initVulkan() void VulkanBackend::VulkanFoundation::createInstance() { // check validation layers - if (setter.settings.validation && !checkValidationLayerSupport()) + if (PlumageRender::Setter::settings.validation && !checkValidationLayerSupport()) { throw std::runtime_error("validation layers requsted,but not available"); } @@ -92,7 +92,7 @@ void VulkanBackend::VulkanFoundation::createInstance() // enable validation layer if available in createInfo VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; - if (setter.settings.validation) + if (PlumageRender::Setter::settings.validation) { createInfo.enabledLayerCount = static_cast(validationLayers.size()); createInfo.ppEnabledLayerNames = validationLayers.data(); @@ -143,7 +143,7 @@ bool VulkanBackend::VulkanFoundation::checkValidationLayerSupport() std::vector VulkanBackend::VulkanFoundation::getRequiredExtensions() { std::vector extensions; - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { uint32_t glfwExtensionCount = 0; const char** glfwExtensions; @@ -152,7 +152,7 @@ std::vector VulkanBackend::VulkanFoundation::getRequiredExtensions( std::vector extensions(glfwExtensions, glfwExtensions + glfwExtensionCount); } - if (setter.settings.validation) + if (PlumageRender::Setter::settings.validation) { extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); @@ -165,7 +165,7 @@ std::vector VulkanBackend::VulkanFoundation::getRequiredExtensions( void VulkanBackend::VulkanFoundation::setupDebugMessager() { - if (!setter.settings.validation) + if (!PlumageRender::Setter::settings.validation) { return; } @@ -222,7 +222,7 @@ VkResult VulkanBackend::VulkanFoundation::CreateDebugUtilsMessengerEXT(VkInstanc void VulkanBackend::VulkanFoundation::createSurface() { - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { return; } @@ -247,9 +247,9 @@ void VulkanBackend::VulkanFoundation::pickPhysicalDevice() } std::vector devices(deviceCount); vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data()); - if (setter.settings.selectedPhysicalDeviceIndex != NULL) + if (PlumageRender::Setter::settings.selectedPhysicalDeviceIndex != NULL) { - physicalDevice = devices[setter.settings.selectedPhysicalDeviceIndex]; + physicalDevice = devices[PlumageRender::Setter::settings.selectedPhysicalDeviceIndex]; } for (const auto& device : devices) @@ -269,7 +269,7 @@ void VulkanBackend::VulkanFoundation::pickPhysicalDevice() bool VulkanBackend::VulkanFoundation::isDeviceSuitable(VkPhysicalDevice device) { - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { bool extensionsSupported = checkDeviceExtensionSupport(device); return extensionsSupported; @@ -320,7 +320,7 @@ VulkanBackend::VulkanFoundation::QueueFamilyIndices VulkanBackend::VulkanFoundat // 检查显示队列支持 int i = 0; - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); } @@ -331,7 +331,7 @@ VulkanBackend::VulkanFoundation::QueueFamilyIndices VulkanBackend::VulkanFoundat indices.graphicsFamily = i; } // 无头下不需要检查present queue - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { if (indices.isGraphicsFamilyComplete()) { @@ -390,7 +390,7 @@ void VulkanBackend::VulkanFoundation::createLogicalDevice() QueueFamilyIndices indices = findQueueFamilies(physicalDevice); std::vector queueCreateInfos; - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { VkDeviceQueueCreateInfo queueCreateInfo{}; queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; @@ -423,7 +423,7 @@ void VulkanBackend::VulkanFoundation::createLogicalDevice() } std::vector enabledExtensions{}; - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { for (auto swapchainExtension: swapchainExtensions) { @@ -440,7 +440,7 @@ void VulkanBackend::VulkanFoundation::createLogicalDevice() deviceCreateInfo.ppEnabledExtensionNames = enabledExtensions.data(); //新版本vulkan已不对实例和设备特定验证层做区分,此处保证兼容性 - if (setter.settings.validation) + if (PlumageRender::Setter::settings.validation) { deviceCreateInfo.enabledLayerCount = static_cast(validationLayers.size()); deviceCreateInfo.ppEnabledLayerNames = validationLayers.data(); @@ -456,7 +456,7 @@ void VulkanBackend::VulkanFoundation::createLogicalDevice() } vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicQueue); - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue); } @@ -468,7 +468,7 @@ void VulkanBackend::VulkanFoundation::createLogicalDevice() void VulkanBackend::VulkanFoundation::createSwapChain() { - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { return; } @@ -561,7 +561,7 @@ VkPresentModeKHR VulkanBackend::VulkanFoundation::chooseSwapPresentMode(const st // If v-sync is not requested, try to find a mailbox mode // It's the lowest latency non-tearing present mode available - if (!setter.settings.vsync) + if (!PlumageRender::Setter::settings.vsync) { for (size_t i = 0; i < presentModeCount; i++) { @@ -607,23 +607,23 @@ void VulkanBackend::VulkanFoundation::createImageView() { VkFormat colorAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; VkFormat depthFormat = findDepthFormat(); - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { - if (setter.settings.multiSampling) + if (PlumageRender::Setter::settings.multiSampling) { VkImageCreateInfo imageCI{}; imageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageCI.imageType = VK_IMAGE_TYPE_2D; imageCI.format = colorAttachmentFormat; - imageCI.extent.width = setter.settings.width; - imageCI.extent.height = setter.settings.height; + imageCI.extent.width = PlumageRender::renderMain::settings.width; + imageCI.extent.height =PlumageRender::renderMain::settings.height; imageCI.extent.depth = 1; imageCI.mipLevels = 1; imageCI.arrayLayers = 1; imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE; imageCI.tiling = VK_IMAGE_TILING_OPTIMAL; - imageCI.samples = setter.settings.sampleCount; + imageCI.samples =PlumageRender::renderMain::settings.sampleCount; imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; @@ -660,14 +660,14 @@ void VulkanBackend::VulkanFoundation::createImageView() // Depth target imageCI.imageType = VK_IMAGE_TYPE_2D; imageCI.format = depthFormat; - imageCI.extent.width = setter.settings.width; - imageCI.extent.height = setter.settings.height; + imageCI.extent.width =PlumageRender::renderMain::settings.width; + imageCI.extent.height =PlumageRender::renderMain::settings.height; imageCI.extent.depth = 1; imageCI.mipLevels = 1; imageCI.arrayLayers = 1; imageCI.sharingMode = VK_SHARING_MODE_EXCLUSIVE; imageCI.tiling = VK_IMAGE_TILING_OPTIMAL; - imageCI.samples = setter.settings.sampleCount; + imageCI.samples =PlumageRender::renderMain::settings.sampleCount; imageCI.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; imageCI.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; VK_CHECK_RESULT(vkCreateImage(device, &imageCI, nullptr, &multisampleTarget.depthAttachment.image)); @@ -700,8 +700,8 @@ void VulkanBackend::VulkanFoundation::createImageView() imageCI.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageCI.imageType = VK_IMAGE_TYPE_2D; imageCI.format = colorAttachmentFormat; - imageCI.extent.width = setter.settings.width; - imageCI.extent.height = setter.settings.height; + imageCI.extent.width =PlumageRender::renderMain::settings.width; + imageCI.extent.height =PlumageRender::renderMain::settings.height; imageCI.extent.depth = 1; imageCI.mipLevels = 1; imageCI.arrayLayers = 1; @@ -749,8 +749,8 @@ void VulkanBackend::VulkanFoundation::createImageView() image.pNext = NULL; image.imageType = VK_IMAGE_TYPE_2D; image.format = depthFormat; - image.extent.width = setter.settings.width; - image.extent.height = setter.settings.height; + image.extent.width =PlumageRender::renderMain::settings.width; + image.extent.height =PlumageRender::renderMain::settings.height; image.extent.depth = 1; image.mipLevels = 1; image.arrayLayers = 1; @@ -836,7 +836,7 @@ void VulkanBackend::VulkanFoundation::createRenderPass() VkFormat colorAttachmentFormat; VkFormat depthAttachmentFormat = findDepthFormat(); VkImageLayout colorAttachmentFinallayout; - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { colorAttachmentFormat = VK_FORMAT_R8G8B8A8_UNORM; colorAttachmentFinallayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; @@ -847,12 +847,12 @@ void VulkanBackend::VulkanFoundation::createRenderPass() colorAttachmentFinallayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; } - if (setter.settings.multiSampling) { + if (PlumageRender::Setter::settings.multiSampling) { std::array attachments = {}; // Multisampled attachment that we render to attachments[0].format = colorAttachmentFormat; - attachments[0].samples = setter.settings.sampleCount; + attachments[0].samples =PlumageRender::renderMain::settings.sampleCount; attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; @@ -873,7 +873,7 @@ void VulkanBackend::VulkanFoundation::createRenderPass() // Multisampled depth attachment we render to attachments[2].format = depthAttachmentFormat; - attachments[2].samples = setter.settings.sampleCount; + attachments[2].samples =PlumageRender::renderMain::settings.sampleCount; attachments[2].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; attachments[2].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; attachments[2].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; @@ -1136,8 +1136,8 @@ void VulkanBackend::VulkanFoundation::createGraphicPipeline() VkPipelineMultisampleStateCreateInfo multisampleStateCI{}; multisampleStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - if (setter.settings.multiSampling) { - multisampleStateCI.rasterizationSamples = setter.settings.sampleCount; + if (PlumageRender::Setter::settings.multiSampling) { + multisampleStateCI.rasterizationSamples =PlumageRender::renderMain::settings.sampleCount; } std::vector dynamicStateEnables = { @@ -1158,7 +1158,7 @@ void VulkanBackend::VulkanFoundation::createGraphicPipeline() pipelineLayoutCI.setLayoutCount = static_cast(setLayouts.size()); pipelineLayoutCI.pSetLayouts = setLayouts.data(); VkPushConstantRange pushConstantRange{}; - pushConstantRange.size = sizeof(pbrMaterial.pushConstBlockMaterial); + pushConstantRange.size = sizeof(PlumageRender::renderMain::pbrmaterial.pushConstBlockMaterial); pushConstantRange.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; pipelineLayoutCI.pushConstantRangeCount = 1; pipelineLayoutCI.pPushConstantRanges = &pushConstantRange; @@ -1200,14 +1200,14 @@ void VulkanBackend::VulkanFoundation::createGraphicPipeline() pipelineCI.stageCount = static_cast(shaderStages.size()); pipelineCI.pStages = shaderStages.data(); - if (setter.settings.multiSampling) { - multisampleStateCI.rasterizationSamples = setter.settings.sampleCount; + if (PlumageRender::Setter::settings.multiSampling) { + multisampleStateCI.rasterizationSamples =PlumageRender::renderMain::settings.sampleCount; } // Skybox pipeline (background cube) shaderStages = { - loadShader(device,setter.filePath.skyboxVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT), - loadShader(device,setter.filePath.skyboxFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT) + loadShader(device,PlumageRender::Setter::filePath.skyboxVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT), + loadShader(device,PlumageRender::Setter::filePath.skyboxFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT) }; VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCI, nullptr, &pipelines.skybox)); for (auto shaderStage : shaderStages) { @@ -1216,8 +1216,8 @@ void VulkanBackend::VulkanFoundation::createGraphicPipeline() // PBR pipeline shaderStages = { - loadShader(device,setter.filePath.pbrVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT), - loadShader(device,setter.filePath.pbrFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT) + loadShader(device,PlumageRender::Setter::filePath.pbrVertShaderPath, VK_SHADER_STAGE_VERTEX_BIT), + loadShader(device,PlumageRender::Setter::filePath.pbrFragShaderPath, VK_SHADER_STAGE_FRAGMENT_BIT) }; depthStencilStateCI.depthWriteEnable = VK_TRUE; depthStencilStateCI.depthTestEnable = VK_TRUE; @@ -1248,9 +1248,9 @@ void VulkanBackend::VulkanFoundation::createGraphicPipeline() void VulkanBackend::VulkanFoundation::createFramebuffer() { - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { - if (setter.settings.multiSampling) + if (PlumageRender::Setter::settings.multiSampling) { for (int i = 0; i < frameRange; i++) { @@ -1264,8 +1264,8 @@ void VulkanBackend::VulkanFoundation::createFramebuffer() framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 4; framebufferCreateInfo.pAttachments = attachments; - framebufferCreateInfo.width = setter.settings.width; - framebufferCreateInfo.height = setter.settings.height; + framebufferCreateInfo.width =PlumageRender::renderMain::settings.width; + framebufferCreateInfo.height =PlumageRender::renderMain::settings.height; framebufferCreateInfo.layers = 1; VK_CHECK_RESULT(vkCreateFramebuffer(device, &framebufferCreateInfo, nullptr, &framebuffers[i])); @@ -1284,8 +1284,8 @@ void VulkanBackend::VulkanFoundation::createFramebuffer() framebufferCreateInfo.renderPass = renderPass; framebufferCreateInfo.attachmentCount = 2; framebufferCreateInfo.pAttachments = attachments; - framebufferCreateInfo.width = setter.settings.width; - framebufferCreateInfo.height = setter.settings.height; + framebufferCreateInfo.width =PlumageRender::renderMain::settings.width; + framebufferCreateInfo.height =PlumageRender::renderMain::settings.height; framebufferCreateInfo.layers = 1; VK_CHECK_RESULT(vkCreateFramebuffer(device, &framebufferCreateInfo, nullptr, &framebuffers[i])); @@ -1305,7 +1305,7 @@ void VulkanBackend::VulkanFoundation::createSwapChainFramebuffer() uint32_t attachmentCount; VkImageView attachments[attachmentCount]; - if (setter.settings.multiSampling) { + if (PlumageRender::Setter::settings.multiSampling) { attachmentCount = 4; attachments[0] = multisampleTarget.colorAttachment.view; attachments[1] = multisampleTarget.depthAttachment.view; @@ -1323,8 +1323,8 @@ void VulkanBackend::VulkanFoundation::createSwapChainFramebuffer() frameBufferCI.renderPass = renderPass; frameBufferCI.attachmentCount = attachmentCount; frameBufferCI.pAttachments = attachments; - frameBufferCI.width = setter.settings.width; - frameBufferCI.height = setter.settings.height; + frameBufferCI.width =PlumageRender::renderMain::settings.width; + frameBufferCI.height =PlumageRender::renderMain::settings.height; frameBufferCI.layers = 1; @@ -1332,7 +1332,7 @@ void VulkanBackend::VulkanFoundation::createSwapChainFramebuffer() // Create frame buffers for every swap chain image framebuffers.resize(swapChainImageViews.size()); for (uint32_t i = 0; i < swapChainImageViews.size(); i++) { - if (setter.settings.multiSampling) { + if (PlumageRender::Setter::settings.multiSampling) { attachments[3] = swapChainImageViews[i]; } else { @@ -1365,7 +1365,7 @@ void VulkanBackend::VulkanFoundation::createCommandPool() void VulkanBackend::VulkanFoundation::createUniformBuffer() { - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { uniformBuffers.resize(frameRange); } @@ -1389,9 +1389,9 @@ void VulkanBackend::VulkanFoundation::updateUniformBuffers() shaderDataScene.view = camera.matrices.view; // Center and scale model - float scale = (1.0f / std::max(models.scene.aabb[0][0], std::max(models.scene.aabb[1][1], models.scene.aabb[2][2]))) * 0.5f; - glm::vec3 translate = -glm::vec3(models.scene.aabb[3][0], models.scene.aabb[3][1], models.scene.aabb[3][2]); - translate += -0.5f * glm::vec3(models.scene.aabb[0][0], models.scene.aabb[1][1], models.scene.aabb[2][2]); + float scale = (1.0f / std::max(PlumageRender::renderMain::models.scene.aabb[0][0], std::max(PlumageRender::renderMain::models.scene.aabb[1][1], PlumageRender::renderMain::models.scene.aabb[2][2]))) * 0.5f; + glm::vec3 translate = -glm::vec3(PlumageRender::renderMain::models.scene.aabb[3][0], PlumageRender::renderMain::models.scene.aabb[3][1], PlumageRender::renderMain::models.scene.aabb[3][2]); + translate += -0.5f * glm::vec3(PlumageRender::renderMain::models.scene.aabb[0][0], PlumageRender::renderMain::models.scene.aabb[1][1], PlumageRender::renderMain::models.scene.aabb[2][2]); shaderDataScene.model = glm::mat4(1.0f); shaderDataScene.model[0][0] = scale; @@ -1423,7 +1423,7 @@ void VulkanBackend::VulkanFoundation::createDescriptorPool() // Environment samplers (radiance, irradiance, brdflut) imageSamplerCount += 3; - std::vector modellist = { &models.skybox, &models.scene }; + std::vector modellist = { &PlumageRender::renderMain::models.skybox, &PlumageRender::renderMain::models.scene }; for (auto& model : modellist) { for (auto& material : model->materials) { imageSamplerCount += 5; @@ -1450,7 +1450,7 @@ void VulkanBackend::VulkanFoundation::createDescriptorPool() void VulkanBackend::VulkanFoundation::createDescriptorSets() { - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { descriptorSets.resize(frameRange); } @@ -1500,21 +1500,21 @@ void VulkanBackend::VulkanFoundation::createSceneDescriptorSets() writeDescriptorSets[2].descriptorCount = 1; writeDescriptorSets[2].dstSet = descriptorSets[i].scene; writeDescriptorSets[2].dstBinding = 2; - writeDescriptorSets[2].pImageInfo = &pbrMaterial.textures.irradianceCube.descriptor; + writeDescriptorSets[2].pImageInfo = &PlumageRender::renderMain::pbrmaterial.textures.irradianceCube.descriptor; writeDescriptorSets[3].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeDescriptorSets[3].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; writeDescriptorSets[3].descriptorCount = 1; writeDescriptorSets[3].dstSet = descriptorSets[i].scene; writeDescriptorSets[3].dstBinding = 3; - writeDescriptorSets[3].pImageInfo = &pbrMaterial.textures.prefilteredCube.descriptor; + writeDescriptorSets[3].pImageInfo = &PlumageRender::renderMain::pbrmaterial.textures.prefilteredCube.descriptor; writeDescriptorSets[4].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeDescriptorSets[4].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; writeDescriptorSets[4].descriptorCount = 1; writeDescriptorSets[4].dstSet = descriptorSets[i].scene; writeDescriptorSets[4].dstBinding = 4; - writeDescriptorSets[4].pImageInfo = &pbrMaterial.textures.lutBrdf.descriptor; + writeDescriptorSets[4].pImageInfo = &PlumageRender::renderMain::pbrmaterial.textures.lutBrdf.descriptor; vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); @@ -1525,7 +1525,7 @@ void VulkanBackend::VulkanFoundation::createSceneDescriptorSets() void VulkanBackend::VulkanFoundation::createMaterialDescriptorSets() { - for (auto& material : models.scene.materials) + for (auto& material : PlumageRender::renderMain::models.scene.materials) { VkDescriptorSetAllocateInfo descriptorSetAllocInfo{}; descriptorSetAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; @@ -1536,11 +1536,11 @@ void VulkanBackend::VulkanFoundation::createMaterialDescriptorSets() std::vector imageDescriptors = { - pbrMaterial.textures.empty.descriptor, - pbrMaterial.textures.empty.descriptor, - material.normalTexture ? material.normalTexture->descriptor : pbrMaterial.textures.empty.descriptor, - material.occlusionTexture ? material.occlusionTexture->descriptor : pbrMaterial.textures.empty.descriptor, - material.emissiveTexture ? material.emissiveTexture->descriptor : pbrMaterial.textures.empty.descriptor + PlumageRender::renderMain::pbrmaterial.textures.empty.descriptor, + PlumageRender::renderMain::pbrmaterial.textures.empty.descriptor, + material.normalTexture ? material.normalTexture->descriptor : PlumageRender::renderMain::pbrmaterial.textures.empty.descriptor, + material.occlusionTexture ? material.occlusionTexture->descriptor : PlumageRender::renderMain::pbrmaterial.textures.empty.descriptor, + material.emissiveTexture ? material.emissiveTexture->descriptor : PlumageRender::renderMain::pbrmaterial.textures.empty.descriptor }; if (material.pbrWorkflows.metallicRoughness) @@ -1585,7 +1585,7 @@ void VulkanBackend::VulkanFoundation::createModelNodeDescriptorSets() { // Per-Node descriptor set - for (auto& node : models.scene.nodes) + for (auto& node : PlumageRender::renderMain::models.scene.nodes) { setupglTFNodeDescriptorSet(node); } @@ -1651,7 +1651,7 @@ void VulkanBackend::VulkanFoundation::createSkyboxDescriptorSets() writeDescriptorSets[2].descriptorCount = 1; writeDescriptorSets[2].dstSet = descriptorSets[i].skybox; writeDescriptorSets[2].dstBinding = 2; - writeDescriptorSets[2].pImageInfo = &pbrMaterial.textures.prefilteredCube.descriptor; + writeDescriptorSets[2].pImageInfo = &PlumageRender::renderMain::pbrmaterial.textures.prefilteredCube.descriptor; vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, nullptr); } @@ -1662,7 +1662,7 @@ void VulkanBackend::VulkanFoundation::createSkyboxDescriptorSets() void VulkanBackend::VulkanFoundation::allocateCommandBuffers() { // resize - if (setter.settings.headless) + if (PlumageRender::Setter::settings.headless) { commandbuffers.resize(frameRange); } @@ -1686,7 +1686,7 @@ void VulkanBackend::VulkanFoundation::createCommandBuffer() cmdBufferBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; VkClearValue clearValues[3]; - if (setter.settings.multiSampling) { + if (PlumageRender::Setter::settings.multiSampling) { clearValues[0].color = { { 0.0f, 0.0f, 0.0f, 1.0f } }; clearValues[1].color = { { 0.0f, 0.0f, 0.0f, 1.0f } }; clearValues[2].depthStencil = { 1.0f, 0 }; @@ -1701,9 +1701,9 @@ void VulkanBackend::VulkanFoundation::createCommandBuffer() renderPassBeginInfo.renderPass = renderPass; renderPassBeginInfo.renderArea.offset.x = 0; renderPassBeginInfo.renderArea.offset.y = 0; - renderPassBeginInfo.renderArea.extent.width = setter.settings.width; - renderPassBeginInfo.renderArea.extent.height = setter.settings.height; - renderPassBeginInfo.clearValueCount = setter.settings.multiSampling ? 3 : 2; + renderPassBeginInfo.renderArea.extent.width =PlumageRender::renderMain::settings.width; + renderPassBeginInfo.renderArea.extent.height =PlumageRender::renderMain::settings.height; + renderPassBeginInfo.clearValueCount =PlumageRender::renderMain::settings.multiSampling ? 3 : 2; renderPassBeginInfo.pClearValues = clearValues; for (uint32_t i = 0; i < commandbuffers.size(); ++i) @@ -1716,25 +1716,25 @@ void VulkanBackend::VulkanFoundation::createCommandBuffer() vkCmdBeginRenderPass(currentCB, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); VkViewport viewport{}; - viewport.width = (float)setter.settings.width; - viewport.height = (float)setter.settings.height; + viewport.width = (float)PlumageRender::Setter::settings.width; + viewport.height = (float)PlumageRender::Setter::settings.height; viewport.minDepth = 0.0f; viewport.maxDepth = 1.0f; vkCmdSetViewport(currentCB, 0, 1, &viewport); VkRect2D scissor{}; - scissor.extent = { setter.settings.width, setter.settings.height }; + scissor.extent = {PlumageRender::renderMain::settings.width,PlumageRender::renderMain::settings.height }; vkCmdSetScissor(currentCB, 0, 1, &scissor); VkDeviceSize offsets[1] = { 0 }; - if (setter.settings.displayBackground) { + if (PlumageRender::Setter::settings.displayBackground) { vkCmdBindDescriptorSets(currentCB, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[i].skybox, 0, nullptr); vkCmdBindPipeline(currentCB, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.skybox); - models.skybox.draw(currentCB); + PlumageRender::renderMain::models.skybox.draw(currentCB); } - glTFModel::Model& model = models.scene; + glTFModel::Model& model = PlumageRender::renderMain::models.scene; vkCmdBindVertexBuffers(currentCB, 0, 1, &model.vertices.buffer, offsets); if (model.indices.buffer != VK_NULL_HANDLE) { @@ -1758,7 +1758,7 @@ void VulkanBackend::VulkanFoundation::createCommandBuffer() } // User interface - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { gui->draw(currentCB); } @@ -1850,16 +1850,16 @@ void VulkanBackend::VulkanFoundation::createglTFNodeCommandBuffer(glTFModel::Nod void VulkanBackend::VulkanFoundation::createFenceAndSemaphore() { - waitFences.resize(setter.settings.MaxFrameInFlight); - presentCompleteSemaphores.resize(setter.settings.MaxFrameInFlight); - renderCompleteSemaphores.resize(setter.settings.MaxFrameInFlight); + waitFences.resize(PlumageRender::Setter::settings.MaxFrameInFlight); + presentCompleteSemaphores.resize(PlumageRender::Setter::settings.MaxFrameInFlight); + renderCompleteSemaphores.resize(PlumageRender::Setter::settings.MaxFrameInFlight); // Command buffer execution fences for (auto& waitFence : waitFences) { VkFenceCreateInfo fenceCI{ VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT }; VK_CHECK_RESULT(vkCreateFence(device, &fenceCI, nullptr, &waitFence)); } - if (!setter.settings.headless) + if (!PlumageRender::Setter::settings.headless) { for (auto& semaphore : presentCompleteSemaphores) { VkSemaphoreCreateInfo semaphoreCI{ VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0 }; diff --git a/src/render/vulkanFoundation.h b/src/render/vulkanFoundation.h index 50810e4..5b97244 100644 --- a/src/render/vulkanFoundation.h +++ b/src/render/vulkanFoundation.h @@ -36,9 +36,12 @@ namespace VulkanBackend const int MAX_FRAME_IN_FLIGHT = 2; - const int frameRange = setter.settings.endFrameIndex - setter.settings.startFrameCount; + const int frameRange =PlumageRender::renderMain::settings.endFrameIndex -PlumageRender::renderMain::settings.startFrameCount; static VkDevice device; + static vks::VulkanDevice* vulkanDevice; + + static VkQueue graphicQueue; struct ShaderData { glm::vec4 lightDir; @@ -54,13 +57,14 @@ namespace VulkanBackend void initVulkan(); - + // 创建描述符集合 + void createDescriptorSets(); private: - PlumageRender::Setter setter; - PBR::Material pbrMaterial; - vks::VulkanDevice* vulkanDevice; + + + VkInstance instance; @@ -95,7 +99,7 @@ namespace VulkanBackend VkSurfaceKHR surface; VkPhysicalDeviceFeatures deviceFeatures; - VkQueue graphicQueue; + VkQueue presentQueue; @@ -134,11 +138,7 @@ namespace VulkanBackend FrameBufferAttachment depthAttachment; } multisampleTarget; - struct Models - { - glTFModel::Model scene; - glTFModel::Model skybox; - } models; + struct DescriptorSetLayouts { VkDescriptorSetLayout scene; @@ -267,8 +267,7 @@ namespace VulkanBackend // 创建描述符池 void createDescriptorPool(); - // 创建描述符集合 - void createDescriptorSets(); + void createSceneDescriptorSets(); void createMaterialDescriptorSets();