void CreateDescriptorSetLayout()
{
VkDescriptorSetLayoutBinding layoutBindings[6] = { };
layoutBindings[0].binding = 0;//.vert文件中layout (binding = 0) uniform MVPBlock
layoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
layoutBindings[0].descriptorCount = 1;
layoutBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
layoutBindings[0].pImmutableSamplers = nullptr;
layoutBindings[1].binding = 1;//.frag文件中layout (binding = 1) uniform ParamBlock
layoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
layoutBindings[1].descriptorCount = 1;
layoutBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
layoutBindings[1].pImmutableSamplers = nullptr;
for (int32 i = 0; i < 4; ++i)
{
/* binding
layout (binding = 2) uniform sampler2D diffuseMap;
layout (binding = 3) uniform sampler2D normalMap;
layout (binding = 4) uniform sampler2D curvatureMap;
layout (binding = 5) uniform sampler2D preIntegratedMap;
*/
layoutBindings[2 + i].binding = 2 + i;//对应上面4个layout (binding = 2~5)
layoutBindings[2 + i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
layoutBindings[2 + i].descriptorCount = 1;
layoutBindings[2 + i].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;//表明.frag文件中
layoutBindings[2 + i].pImmutableSamplers = nullptr;
}
VkDescriptorSetLayoutCreateInfo descSetLayoutInfo;
ZeroVulkanStruct(descSetLayoutInfo, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
descSetLayoutInfo.bindingCount = 6;//layoutBindings的元素个数为6个
descSetLayoutInfo.pBindings = layoutBindings;
VERIFYVULKANRESULT(vkCreateDescriptorSetLayout(m_Device, &descSetLayoutInfo, VULKAN_CPU_ALLOCATOR, &m_DescriptorSetLayout));
VkPipelineLayoutCreateInfo pipeLayoutInfo;
ZeroVulkanStruct(pipeLayoutInfo, VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO);
pipeLayoutInfo.setLayoutCount = 1;
pipeLayoutInfo.pSetLayouts = &m_DescriptorSetLayout;
VERIFYVULKANRESULT(vkCreatePipelineLayout(m_Device, &pipeLayoutInfo, VULKAN_CPU_ALLOCATOR, &m_PipelineLayout));
}
void CreateDescriptorSet()
{
VkDescriptorPoolSize poolSizes[2];
poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
poolSizes[0].descriptorCount = 2;//2个描述符,m_MVPBuffer,m_ParamBuffer
poolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
poolSizes[1].descriptorCount = 4;//4个描述符,m_TexDiffuse, m_TexNormal, m_TexCurvature, m_TexPreIntegrated
VkDescriptorPoolCreateInfo descriptorPoolInfo;
ZeroVulkanStruct(descriptorPoolInfo, VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO);
descriptorPoolInfo.poolSizeCount = 2;//poolSizes元素个数为2个
descriptorPoolInfo.pPoolSizes = poolSizes;
descriptorPoolInfo.maxSets = 1;
VERIFYVULKANRESULT(vkCreateDescriptorPool(m_Device, &descriptorPoolInfo, VULKAN_CPU_ALLOCATOR, &m_DescriptorPool));
VkDescriptorSetAllocateInfo allocInfo;
ZeroVulkanStruct(allocInfo, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO);
allocInfo.descriptorPool = m_DescriptorPool;
allocInfo.descriptorSetCount = 1;
allocInfo.pSetLayouts = &m_DescriptorSetLayout;
VERIFYVULKANRESULT(vkAllocateDescriptorSets(m_Device, &allocInfo, &m_DescriptorSet));
VkWriteDescriptorSet writeDescriptorSet;
ZeroVulkanStruct(writeDescriptorSet, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET);
writeDescriptorSet.dstSet = m_DescriptorSet;
writeDescriptorSet.descriptorCount = 1;
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
writeDescriptorSet.pBufferInfo = &(m_MVPBuffer->descriptor);
writeDescriptorSet.dstBinding = 0;
vkUpdateDescriptorSets(m_Device, 1, &writeDescriptorSet, 0, nullptr);
ZeroVulkanStruct(writeDescriptorSet, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET);
writeDescriptorSet.dstSet = m_DescriptorSet;
writeDescriptorSet.descriptorCount = 1;
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
writeDescriptorSet.pBufferInfo = &(m_ParamBuffer->descriptor);
writeDescriptorSet.dstBinding = 1;
vkUpdateDescriptorSets(m_Device, 1, &writeDescriptorSet, 0, nullptr);
std::vector<vk_demo::DVKTexture*> textures = { m_TexDiffuse, m_TexNormal, m_TexCurvature, m_TexPreIntegrated };
for (int32 i = 0; i < 4; ++i)
{
ZeroVulkanStruct(writeDescriptorSet, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET);
writeDescriptorSet.dstSet = m_DescriptorSet;
writeDescriptorSet.descriptorCount = 1;
writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
writeDescriptorSet.pBufferInfo = nullptr;
writeDescriptorSet.pImageInfo = &(textures[i]->descriptorInfo);
writeDescriptorSet.dstBinding = 2 + i;
vkUpdateDescriptorSets(m_Device, 1, &writeDescriptorSet, 0, nullptr);
}
}