重构完成资源描述符层级
parent
c970164ccb
commit
baa5457b4e
|
@ -576,11 +576,12 @@ VulkanExampleBase::~VulkanExampleBase()
|
||||||
|
|
||||||
void VulkanExampleBase::initVulkan()
|
void VulkanExampleBase::initVulkan()
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
|
||||||
/*
|
|
||||||
Instance creation
|
Instance creation
|
||||||
*/
|
|
||||||
err = createInstance(settings.validation);
|
err = createInstance(settings.validation);
|
||||||
if (err) {
|
if (err) {
|
||||||
std::cerr << "Could not create Vulkan instance!" << std::endl;
|
std::cerr << "Could not create Vulkan instance!" << std::endl;
|
||||||
|
@ -590,7 +591,7 @@ void VulkanExampleBase::initVulkan()
|
||||||
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
|
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
|
||||||
vks::android::loadVulkanFunctions(instance);
|
vks::android::loadVulkanFunctions(instance);
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
Validation layers
|
Validation layers
|
||||||
|
|
||||||
|
@ -1778,6 +1779,7 @@ void VulkanExampleBase::windowDidResize()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void VulkanExampleBase::windowResized() {}
|
void VulkanExampleBase::windowResized() {}
|
||||||
|
|
||||||
void VulkanExampleBase::setupFrameBuffer()
|
void VulkanExampleBase::setupFrameBuffer()
|
||||||
|
|
|
@ -340,18 +340,7 @@ void PlumageRender::setupDescriptors()
|
||||||
|
|
||||||
// Scene (matrices and environment maps)
|
// 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++) {
|
for (auto i = 0; i < descriptorSets.size(); i++) {
|
||||||
|
|
||||||
|
@ -405,18 +394,7 @@ void PlumageRender::setupDescriptors()
|
||||||
|
|
||||||
// Material (samplers)
|
// 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
|
// Per-Material descriptor sets
|
||||||
for (auto& material : models.scene.materials) {
|
for (auto& material : models.scene.materials) {
|
||||||
|
@ -468,14 +446,7 @@ void PlumageRender::setupDescriptors()
|
||||||
|
|
||||||
// Model node (matrices)
|
// 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
|
// Per-Node descriptor set
|
||||||
for (auto& node : models.scene.nodes) {
|
for (auto& node : models.scene.nodes) {
|
||||||
|
@ -1529,7 +1500,7 @@ void PlumageRender::windowResized()
|
||||||
|
|
||||||
void PlumageRender::prepare()
|
void PlumageRender::prepare()
|
||||||
{
|
{
|
||||||
VulkanExampleBase::prepare();
|
//VulkanExampleBase::prepare();
|
||||||
|
|
||||||
camera.type = Camera::CameraType::lookat;
|
camera.type = Camera::CameraType::lookat;
|
||||||
|
|
||||||
|
|
|
@ -194,11 +194,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct DescriptorSetLayouts {
|
|
||||||
VkDescriptorSetLayout scene;
|
|
||||||
VkDescriptorSetLayout material;
|
|
||||||
VkDescriptorSetLayout node;
|
|
||||||
} descriptorSetLayouts;
|
|
||||||
|
|
||||||
std::vector<DescriptorSets> descriptorSets;
|
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;
|
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;
|
VkRenderPass renderPass;
|
||||||
|
|
||||||
|
struct DescriptorSetLayouts {
|
||||||
|
VkDescriptorSetLayout scene;
|
||||||
|
VkDescriptorSetLayout material;
|
||||||
|
VkDescriptorSetLayout node;
|
||||||
|
} descriptorSetLayouts;
|
||||||
|
|
||||||
// 句柄创建,检查校验层支持和获取需要的扩展
|
// 句柄创建,检查校验层支持和获取需要的扩展
|
||||||
void createInstance();
|
void createInstance();
|
||||||
bool checkValidationLayerSupport();
|
bool checkValidationLayerSupport();
|
||||||
|
@ -133,6 +139,35 @@ namespace VulkanBackend
|
||||||
VkFormat findDepthFormat();
|
VkFormat findDepthFormat();
|
||||||
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
|
VkFormat findSupportedFormat(const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
|
||||||
bool hasStencilComponent(VkFormat format);
|
bool hasStencilComponent(VkFormat format);
|
||||||
|
|
||||||
|
// 创建资源描述符层级,用于访问绑定的资源
|
||||||
|
void createDescriptorSetLayout();
|
||||||
|
|
||||||
|
// 创建图形管线
|
||||||
|
void createGraphicPipeline();
|
||||||
|
|
||||||
|
// 创建帧缓冲区
|
||||||
|
void createFramebuffer();
|
||||||
|
|
||||||
|
// 创建命令缓冲池
|
||||||
|
void createCommandPool();
|
||||||
|
|
||||||
|
// 创建顶点缓存区
|
||||||
|
void createVertexBuffer();
|
||||||
|
|
||||||
|
// 创建索引缓存区
|
||||||
|
void createIndexBuffer();
|
||||||
|
|
||||||
|
// 创建统一缓冲区
|
||||||
|
void createUniformBuffer();
|
||||||
|
|
||||||
|
// 创建描述符池
|
||||||
|
void createDescriptorPool();
|
||||||
|
|
||||||
|
// 创建描述符集合
|
||||||
|
void createDescriptorSets();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
VulkanFondation::VulkanFondation()
|
VulkanFondation::VulkanFondation()
|
||||||
|
|
Loading…
Reference in New Issue