在 Vulkan 光线追踪中计算着色器

Compute shader in vulkan raytracing

我在 vulkan forums and NVIDIA forums. Due to lack of responses, I tried to modify the ray tracing example 上发布了这个问题,方法是将最近的命中着色器重新用作计算着色器

  VkPipelineShaderStageCreateInfo stage{VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
  stage.stage = VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;

我因此收到以下验证错误

 vkCreateRayTracingPipelinesKHR: value of pCreateInfos[0].pStages[3].stage contains multiple members of VkShaderStageFlagBits when only a single value is allowed The Vulkan spec states: stage must be a valid VkShaderStageFlagBits value 

我对此有以下问题

  1. 最近命中着色器是否需要 VK_SHADER_STAGE_COMPUTE_BIT 值才能使用协作矩阵?
  2. 我认为这 澄清了不能为 stage 属性设置多个值。这是否意味着我试图做的事情在设计上是不可能的?

注意:我是 vulkan 的新手,仍在学习中。

谢谢

免责声明:我从未使用过 VK_NV_cooperative_matrix 扩展程序。

Does the closest hit shader need the VK_SHADER_STAGE_COMPUTE_BIT value to use cooperative matrices?

我想你误解了 VkPipelineShaderStageCreateInfo::stage 的目的:它 不给任何 属性 任何东西 。它指定在管道的哪个阶段使用module。所以你试图做的 cannot 可能行得通。没有着色器需要任何 VkShaderStageFlagBits。着色器可能甚至不知道它是从 Vulkan 调用的。但是 Vulkan 需要知道何时调用着色器。

此外,在使用 vkCreateRayTracingPipelinesKHR(或其 NV 等效项)创建的 VkPipeline 中调用光线跟踪着色器。 但是计算着色器是在 vkCreateComputePipelines 创建的一个中调用的。这些是完全不同的东西:

图片来源: Introduction to Real-Time Ray Tracing with Vulkan - NVIDIA Developer blog

这张图片比较了经典光栅化管线(使用 vkCreateGraphicsPipelines 创建)和光线追踪管线,但您明白了。


I think this clarifies that multiple values cannot be set for the stage attribute. Does this mean that what I am trying to do is not possible by design?

我不太明白你说的"what I am trying to do"是什么意思(主要是你的第一句话)所以:

  • 如果你的意思是"给VkPipelineShaderStageCreateInfo两个阶段,答案是是的,这是不可能的(至少从 Vulkan 1.3 开始)。

  • 如果你的意思是“让closest-hit着色器像计算着色器一样工作”,答案又是是的,这(可能)是不可能的,但不是出于同样的原因。 如果你告诉 glslang “让我用那个东西计算着色器”,你可能有 ray-tracing 专用函数,这些函数根本不会编译。.

  • 如果另一方面您的意思是 “在 closest-hit 着色器中使用合作矩阵”我真的不知道知道。但我认为使用它们应该没有任何问题。 The extension description 说了以下内容(强调我的):

[...] Cooperative matrix types are medium-sized matrices that are primarily supported in compute shaders, where the storage for the matrix is spread across all invocations in some scope (usually a subgroup) and those invocations cooperate to efficiently perform matrix multiplies.[...]

如果我没有理解错的话,这并不意味着其他类型的着色器不支持它。只是它主要在计算着色器中使用(并因此得到支持)。同样,我从未使用过该扩展程序,所以我可能是错的。

请注意,这是一个设备扩展,需要在创建逻辑设备时手动启用它 (VkDevice)。 您还需要在使用它的着色器顶部添加一个 #extension GL_NV_cooperative_matrix : enable


也就是说,您 真的 需要在 closest-hit 着色器中使用那些协作矩阵吗?拥有它们会给您带来什么性能提升?请记住,您最近的命中着色器在每个交叉点被调用。查看您在 Vulkan 论坛上发布的代码,我相信您的方法会让您失去更多。