在Vulkan中,我想遵循DescriptorSets的惯例,set=0包含用于调试的内容,而set=1是整个框架的通用集合。着色器可能使用或不使用这2套提供的绑定,取决于他们需要什么。此外,着色器将从set=2开始使用特定于着色器的绑定。
着色器可以被编码,以使用任何设定的数字。然而,管道期望集合数为0-N。不可能告诉PSO它使用的是集合2-5;当给定VkPipelineLayoutCreateInfo::pSetLayouts中的描述符布局时,它将假设使用0-3。
那么,如果我想要有这种类型的公共设置号(比如用于调试的set=0 ),那么我必须在所有VkPipelineLayoutCreateInfo定义中复制集合布局,即使着色器不使用这些设置?
发布于 2022-06-13 22:00:40
,即使着色器不使用这些设置?
但他们确实利用了它们。你把它们放在那里。它们占据了空间。
描述符集是虚构的,是代码和Vulkan实现之间的协议,它最终并不代表任何关于实际GPU正在做什么的真实情况。在硬件中,只有一组资源可供您的管道使用。描述符集抽象GPU的资源系统。
为了使Vulkan实现尽可能高效,实现需要能够从绑定到命令缓冲区的一组描述符和这些描述符的实际底层资源映射中快速映射。但是,如果用户可以更改某些资源而不更改所有当前绑定的资源,这将是有用的。
为此,对管道使用并绑定到上下文的描述符集进行排序。Set 0首先获取资源,然后设置1、2等等。因此,从描述符到资源的映射是基于所有低编号描述符集的映射。
例如,假设GPU有一些纹理数组,着色器可以从中取样。如果set 0有两个纹理描述符,则得到数组索引0和1。因此,如果set 1中有一个纹理描述符,则该描述符使用索引2。
实现能够知道set 1使用纹理索引2的唯一方法是看到set 0已经使用了两个纹理索引。这需要访问set 0的布局。这适用于绑定时间(这就是为什么vkCmdBindDescriptorSets需要一个VkPipelineLayout),但也适用于管道创建时。
因此,管道不能仅仅是“使用集合2-5";它使用五个集合,即使它从未直接从集合0和1访问资源。
注意:很多实现都有4个描述符集的限制。你不应该依赖于拥有更多,因为这是最低的Vulkan要求。
https://stackoverflow.com/questions/72608783
复制相似问题