vulkan - 如何在计算着色器写入和顶点属性读取之间创建障碍
问题描述
我有一个粒子系统,首先我运行一个计算着色器并更新所有属性,然后我将这些属性用作顶点着色器中的 vao 输入。
现在我需要在这些阶段之间设置一个障碍,但我不知道该怎么做,无论我尝试什么,我都会遇到一些错误。
目前我有这样的管道障碍:
VkMemoryBarrier memoryBarrier;
memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
memoryBarrier.pNext = nullptr;
memoryBarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
memoryBarrier.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
VK_PIPELINE_STAGE_VERTEX_INPUT_B
我用这个依赖创建了渲染通道:
VkSubpassDependency computeDependency;
computeDependency.srcSubpass = 0;
computeDependency.dstSubpass = 0;
computeDependency.srcStageMask = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
computeDependency.dstStageMask = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
computeDependency.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
computeDependency.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
computeDependency.dependencyFlags = 0;
但这不起作用,因为我收到此错误:验证层:依赖项 1 指定了一个源阶段掩码,其中包含源子通道 0 使用的不在 GRAPHICS 管道中的阶段。Vulkan 规范指出:对于 pDependencies 的任何元素,如果srcSubpass 不是 VK_SUBPASS_EXTERNAL,包含在该依赖项的 srcStageMask 成员中的所有阶段标志必须是由源子通道的 pipelineBindPoint 成员标识的管道支持的管道阶段(https://www.khronos.org/registry/vulkan/规格/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00837)
解决方案
您不能在子通道中间执行计算着色器。的渲染通道范围vkCmdDispatch
是“外部”,这也是为什么子通道之间的依赖关系只能指定图形操作支持的阶段。因此,渲染进程中计算着色器和消费者之间的任何依赖都是外部依赖:包含渲染进程的子通道与外部世界之间的依赖。
所以你srcSubpass
应该是VK_SUBPASS_EXTERNAL
。
推荐阅读
- ios - UISlider 的自定义拇指图像未显示完整的图像图标大小
- python - 在 python 中的网页抓取方面需要一些帮助
- node.js - 将从 pdfkit 生成的 PDF 作为输入提供给 pdf-lib 以进行合并
- android - 为什么 RoomDatabase.Callback 方法 onCreate 提供了 SupportSQLiteDatabase 参数?
- javascript - 无法实现 ValidatorFn 接口
- angular - 如何在构造函数中使用 Jasmine 私有 ActivatedRoute 进行测试?
- symfony - 在 symfony 中注入许多类似服务的最佳实践是什么?
- flutter - 如何将粘性标题添加到列表视图?
- java-native-interface - 如何使用Angr分析共享库中的JNI函数?
- pandas - 使用 to_datetime 几个列名