重构完成资源描述符层级
parent
c970164ccb
commit
baa5457b4e
|
@ -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()
|
||||
|
|
|
@ -340,18 +340,7 @@ void PlumageRender::setupDescriptors()
|
|||
|
||||
// Scene (matrices and environment maps)
|
||||
{
|
||||
std::vector<VkDescriptorSetLayoutBinding> 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<uint32_t>(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<VkDescriptorSetLayoutBinding> 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<uint32_t>(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<VkDescriptorSetLayoutBinding> 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<uint32_t>(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;
|
||||
|
||||
|
|
|
@ -194,11 +194,7 @@ public:
|
|||
|
||||
|
||||
|
||||
struct DescriptorSetLayouts {
|
||||
VkDescriptorSetLayout scene;
|
||||
VkDescriptorSetLayout material;
|
||||
VkDescriptorSetLayout node;
|
||||
} descriptorSetLayouts;
|
||||
|
||||
|
||||
std::vector<DescriptorSets> descriptorSets;
|
||||
|
||||
|
|
|
@ -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<VkDescriptorSetLayoutBinding> 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<uint32_t>(setLayoutBindings.size());
|
||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.scene));
|
||||
|
||||
// 材质或材质采样器的资源描述符
|
||||
std::vector<VkDescriptorSetLayoutBinding> 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<uint32_t>(setLayoutBindings.size());
|
||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.material));
|
||||
|
||||
// 模型结点或矩阵的资源描述符
|
||||
std::vector<VkDescriptorSetLayoutBinding> 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<uint32_t>(setLayoutBindings.size());
|
||||
VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.node));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<VkFormat>& 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()
|
||||
|
|
Loading…
Reference in New Issue