【发布时间】:2022-07-04 14:37:47
【问题描述】:
我在着色器管道中有以下制服:
layout (set = 1, binding = 0) 统一 window_uniform_data_uniform {};
现在我想绑定这个集合,所以我这样做了:
vkCmdBindDescriptorSets(cmd_buffer->vk_buffer_handle, VkPipelineBindPoint::VK_PIPELINE_BIND_POINT_GRAPHICS,
PipelineLayouts::GUI,
1, // THE UNIFORM BUFFER IS SET 1
1,
&DescriptorSets::GUI, 0, nullptr);
当我调用该函数时,我得到验证错误:
Vulkan 验证层回调:验证错误:[ VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter] 对象 0: 句柄 = 0x1acf6211460,类型 = VK_OBJECT_TYPE_INSTANCE; |消息ID = 0xb3f957d3 |无效的 VkDescriptorSetLayout 对象 0x0。 Vulkan 规范 状态:如果 setLayoutCount 不为 0,则 pSetLayouts 必须是有效的 指向 setLayoutCount 有效 VkDescriptorSetLayout 数组的指针 把手
我认为发生这种情况的原因是因为在管道布局描述中我说有一组布局计数:
pipelineLayoutInfo.setLayoutCount = 1;
pipelineLayoutInfo.pSetLayouts = &DescriptorSetLayouts::GUI;
这对我来说很有意义,因为在着色器中我只设置了 = 1,没有设置 0。但是我认为正在发生的事情发生在我通过的 vkCmdBindDescriptorSets (firstSet (1), descriptorSetCount(1) ) 中,因为我只想要更新集合 1。Vulkan 可能会查找管道布局的元素/位置 1,并发现它是空的或具有无效参数。这是正确的吗?
如果是这种情况,这是否意味着如果我在设置 = 11 的着色器中有一个描述,即使我从未更新它们,也需要使用 10 个虚拟布局创建管道?
【问题讨论】:
-
"如果我在着色器中有一个设置 = 11 的描述" 忽略几乎没有 Vulkan 实现一次支持 12 个描述符集这一事实,你为什么还要去做?你认为不同的描述符集 for 到底是什么?
-
@NicolBolas 我相信我正确地使用了这些集合,设置 0 我将用于某些数据,设置 1 用于另一种类型的数据。但是我有一个只使用 1 而不是 0 的片段着色器,因此布局计数为 1 是有道理的,因为该着色器只使用一个。在这种情况下,我似乎确实需要一个虚拟集布局。你觉得这听起来很奇怪吗?我的意思是我做错了什么?
-
又来了个问题:为什么只使用set 1?这些集合是什么意思?你说它们是针对某种类型的数据,但你并没有真正解释那是什么。我链接到的问题涉及功能的设计;这与您在这里要实现的目标有何契合?
-
@NicolBolas 我们会很快进入选择纹理的阶段吗?因此,您实际上可以将指向图像的指针存储在统一缓冲区中,然后从着色器中选择该图像?这将完全绕过描述符。我相信这就是我提到的那些扩展的作用,但它不适用于图像,不是吗?
标签: vulkan