首页 > 解决方案 > 如何使用两个计算着色器创建 Vulkan 图形管道

问题描述

我正在尝试进行一个模拟,该模拟在渲染之前涉及两个计算步骤。我目前正在使用计算基本物理的计算管道,然后是图形管道。我希望能够添加第二个计算着色器以在第一个之后运行。

首先,Vulkan 中是否可以有两个连续的计算着色器?

我尝试了几种不同的变体来获得第二个计算着色器。我认为最有前途的方法是在调用 vkCreateComputePipelines 时,传入 VkComputePipelineCreateInfo 和 VkPipeline 的数组,并将 createInfoCount 更改为 2。根据文档,createInfoCount 似乎指的是 createInfo 和管道的数量,这导致我们相信有可能有多个管道,但这会导致崩溃。只使用一个计算着色器,而不是传入长度为 1 的数组,我直接传入 createInfo 和管道的地址。将 createInfo 更改为数组可以正常工作,但是一旦我尝试将管道参数更改为指向数组(即使该数组中只有一个管道),它也会导致崩溃。

我们考虑的另一种方法是在 VkComputePipelineCreateInfo 中添加多个 computeShaderStageInfo,然后只有一个 createInfo 和一个计算管道。但是,与 VkGraphicsPipelineCreateInfo 不同,它似乎只允许单个阶段,而不是阶段数组。

我还尝试为第二个计算着色器创建第二个 VkCommandBuffer。我能够将描述符集绑定到两个命令缓冲区,但只运行最后调度的一个。

标签: vulkancompute-shader

解决方案


首先,Vulkan 中是否可以有两个连续的计算着色器?

不。计算着色器没有用户定义的输入,也没有输出,因此包含连续计算着色器的管道没有直接的通信方式。每个调度操作执行一个计算着色器阶段,仅此而已。

如果你想要两个连续的计算着色器,你需要两个管道,每个管道都有不同的计算着色器,以及它们之间的适当同步原语,以便它们可以通信。


推荐阅读