diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index ce3c2b4..f8a8f0e 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -576,11 +576,12 @@ VulkanExampleBase::~VulkanExampleBase() void VulkanExampleBase::initVulkan() { + /* VkResult err; - /* + Instance creation - */ + err = createInstance(settings.validation); if (err) { std::cerr << "Could not create Vulkan instance!" << std::endl; @@ -590,7 +591,7 @@ void VulkanExampleBase::initVulkan() #if defined(VK_USE_PLATFORM_ANDROID_KHR) vks::android::loadVulkanFunctions(instance); #endif - +*/ /* Validation layers @@ -1778,6 +1779,7 @@ void VulkanExampleBase::windowDidResize() } #endif + void VulkanExampleBase::windowResized() {} void VulkanExampleBase::setupFrameBuffer() diff --git a/src/render/render.cpp b/src/render/render.cpp index ced2dee..9cdc2ea 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -340,18 +340,7 @@ void PlumageRender::setupDescriptors() // Scene (matrices and environment maps) { - std::vector setLayoutBindings = { - { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - }; - VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI{}; - descriptorSetLayoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptorSetLayoutCI.pBindings = setLayoutBindings.data(); - descriptorSetLayoutCI.bindingCount = static_cast(setLayoutBindings.size()); - VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.scene)); + for (auto i = 0; i < descriptorSets.size(); i++) { @@ -405,18 +394,7 @@ void PlumageRender::setupDescriptors() // Material (samplers) { - std::vector setLayoutBindings = { - { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - { 4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, - }; - VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI{}; - descriptorSetLayoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptorSetLayoutCI.pBindings = setLayoutBindings.data(); - descriptorSetLayoutCI.bindingCount = static_cast(setLayoutBindings.size()); - VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.material)); + // Per-Material descriptor sets for (auto& material : models.scene.materials) { @@ -468,14 +446,7 @@ void PlumageRender::setupDescriptors() // Model node (matrices) { - std::vector setLayoutBindings = { - { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT, nullptr }, - }; - VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI{}; - descriptorSetLayoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - descriptorSetLayoutCI.pBindings = setLayoutBindings.data(); - descriptorSetLayoutCI.bindingCount = static_cast(setLayoutBindings.size()); - VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.node)); + // Per-Node descriptor set for (auto& node : models.scene.nodes) { @@ -1529,7 +1500,7 @@ void PlumageRender::windowResized() void PlumageRender::prepare() { - VulkanExampleBase::prepare(); + //VulkanExampleBase::prepare(); camera.type = Camera::CameraType::lookat; diff --git a/src/render/render.h b/src/render/render.h index 506c8a6..785be93 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -194,11 +194,7 @@ public: - struct DescriptorSetLayouts { - VkDescriptorSetLayout scene; - VkDescriptorSetLayout material; - VkDescriptorSetLayout node; - } descriptorSetLayouts; + std::vector descriptorSets; diff --git a/src/render/vulkanFoundation.cpp b/src/render/vulkanFoundation.cpp index 0cd0623..1ed0bad 100644 --- a/src/render/vulkanFoundation.cpp +++ b/src/render/vulkanFoundation.cpp @@ -823,4 +823,45 @@ bool VulkanBackend::VulkanFondation::hasStencilComponent(VkFormat format) return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT; } +void VulkanBackend::VulkanFondation::createDescriptorSetLayout() +{ + // scene,场景的资源描述符 + std::vector setLayoutBindings = { + { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + }; + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI{}; + descriptorSetLayoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptorSetLayoutCI.pBindings = setLayoutBindings.data(); + descriptorSetLayoutCI.bindingCount = static_cast(setLayoutBindings.size()); + VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.scene)); + + // 材质或材质采样器的资源描述符 + std::vector setLayoutBindings = { + { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 3, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + { 4, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, + }; + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI{}; + descriptorSetLayoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptorSetLayoutCI.pBindings = setLayoutBindings.data(); + descriptorSetLayoutCI.bindingCount = static_cast(setLayoutBindings.size()); + VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.material)); + + // 模型结点或矩阵的资源描述符 + std::vector setLayoutBindings = { + { 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT, nullptr }, + }; + VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI{}; + descriptorSetLayoutCI.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptorSetLayoutCI.pBindings = setLayoutBindings.data(); + descriptorSetLayoutCI.bindingCount = static_cast(setLayoutBindings.size()); + VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.node)); +} + diff --git a/src/render/vulkanFoundation.h b/src/render/vulkanFoundation.h index 9a42162..acd770b 100644 --- a/src/render/vulkanFoundation.h +++ b/src/render/vulkanFoundation.h @@ -91,6 +91,12 @@ namespace VulkanBackend VkRenderPass renderPass; + struct DescriptorSetLayouts { + VkDescriptorSetLayout scene; + VkDescriptorSetLayout material; + VkDescriptorSetLayout node; + } descriptorSetLayouts; + // 句柄创建,检查校验层支持和获取需要的扩展 void createInstance(); bool checkValidationLayerSupport(); @@ -133,6 +139,35 @@ namespace VulkanBackend VkFormat findDepthFormat(); VkFormat findSupportedFormat(const std::vector& candidates, VkImageTiling tiling, VkFormatFeatureFlags features); bool hasStencilComponent(VkFormat format); + + // 创建资源描述符层级,用于访问绑定的资源 + void createDescriptorSetLayout(); + + // 创建图形管线 + void createGraphicPipeline(); + + // 创建帧缓冲区 + void createFramebuffer(); + + // 创建命令缓冲池 + void createCommandPool(); + + // 创建顶点缓存区 + void createVertexBuffer(); + + // 创建索引缓存区 + void createIndexBuffer(); + + // 创建统一缓冲区 + void createUniformBuffer(); + + // 创建描述符池 + void createDescriptorPool(); + + // 创建描述符集合 + void createDescriptorSets(); + + }; VulkanFondation::VulkanFondation()