我将使用的一些网格并不总是具有 DiffuseMap 或 SpecularMap。当我尝试加载没有漫反射和镜面反射贴图的内容时,程序崩溃,因为 DiffuseMap.ImageView/SpecularMap.ImageView 中没有任何内容,因为它没有指向任何内容。如果我尝试将 imageview/sample 设置为 VK_NULL_HANDLE,程序会给出此信息并在 vkUpdateDescriptorSets 处崩溃:
Validation Layer: Invalid VkImageView Object 0x0. The Vulkan spec states: If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout members of each element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00326)
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试将绑定设置为 null,我会得到以下结果:
Validation Layer: vkUpdateDescriptorSets: required parameter pDescriptorWrites[2].dstSet specified as VK_NULL_HANDLE
Run Code Online (Sandbox Code Playgroud)
验证层:无法对尚未分配的 VkDescriptorSet 0x0[] 调用 vkUpdateDescriptorSets()。
这就是基本代码现在的样子。这是定义描述符集的区域,以便更容易地查看正在发生的情况:
void Mesh::CreateDescriptorSets(VulkanRenderer& Renderer)
{
BaseMesh::CreateDescriptorSets(Renderer, *GetDescriptorSetLayout(Renderer));
VkDescriptorImageInfo DiffuseMap = {};
DiffuseMap.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
DiffuseMap.imageView = …Run Code Online (Sandbox Code Playgroud)