光线追踪

光线追踪使用与图形和计算管线都不同的单独渲染管线(请参阅 光线追踪管线)。

ray tracing execution
图 1. 光线追踪管线执行
标题

光线追踪管线中不同着色器阶段之间的交互

在光线追踪管线中,可以调用 管线追踪光线 指令来执行 光线遍历,从而在其执行期间调用各种光线追踪着色器阶段。光线追踪管线对象和遍历的加速结构中存在的几何体之间的关系,通过一个称为着色器绑定表VkBuffer 对象传递给光线追踪命令。OpExecuteCallableKHR 也可以在光线追踪管线中使用,以调用 可调用着色器

在执行期间,控制在调度和其他操作之间交替。调度功能是特定于实现的,负责工作负载执行。着色器阶段是可编程的。 遍历是指遍历加速结构以查找光线与几何体的潜在交点的过程,是固定功能。

管线的可编程部分在单射线编程模型中公开,每次调用处理一个光线。可以使用标准内存屏障同步内存操作。在光线追踪管线中必须不使用 Workgroup 范围和存储类为 Workgroup 的变量。

着色器调用指令

着色器调用是指一条可能通过创建执行不同着色器阶段的一个或多个调用来导致执行在其他地方继续的指令。

下表列出了所有着色器调用指令以及每个指令可以直接调用的阶段。

指令 相交 任何命中 最近命中 未命中 可调用

OpTraceRayKHR

X

X

X

X

OpTraceRayMotionNV

X

X

X

X

OpReportIntersectionKHR

X

OpExecuteCallableKHR

X

OpHitObjectTraceRayNV

X

X

OpHitObjectTraceRayMotionNV

X

X

OpHitObjectExecuteShaderNV

X

X

着色器调用指令创建的调用由实现分组为子组。这些子组可能与父调用的子组无关。

管线追踪光线指令可以递归使用;调用的着色器可以自己执行管线追踪光线指令,最大深度由 maxRecursionDepthmaxRayRecursionDepth 限制定义。

直接从 API 调用的着色器始终具有 0 的递归深度;由管线追踪光线指令执行的每个着色器的递归深度都比调用它的着色器的递归深度高 1。应用程序必须不调用递归深度大于管线中指定的 maxRecursionDepthmaxPipelineRayRecursionDepth 值的着色器。

对于其他可能递归的着色器调用指令(例如 OpExecuteCallableKHR),没有显式的递归限制,但存在由 堆栈大小 确定的上限。

调用重打包指令是一条光线追踪指令,其中实现可能会更改正在执行的调用集。当遇到重打包指令时,该调用会被暂停,并开始新的调用并执行该指令。执行重打包指令(可能导致其他光线追踪着色器阶段执行)后,新调用结束,原始调用恢复,但可能在不同的子组中或在同一子组中以不同的 SubgroupLocalInvocationId 恢复。当子组中的一部分调用执行调用重打包指令时,那些不执行此指令的调用将保留在相同的子组中,并具有相同的 SubgroupLocalInvocationId

OpTraceRayKHROpTraceRayMotionNVOpReorderThreadWithHintNVOpReorderThreadWithHitObjectNVOpReportIntersectionKHROpExecuteCallableKHR 指令是调用重打包指令。

在着色器调用指令之前、指令之后或由指令创建的执行调用是着色器调用相关的

如果实现更改了子组的构成,则调用重新打包指令必须相应地更改 SubgroupSizeSubgroupLocalInvocationIdSMIDNVWarpIDNV 以及从中派生的内置变量(SubgroupEqMaskSubgroupGeMaskSubgroupGtMaskSubgroupLeMaskSubgroupLtMask)的值。当在光线生成、最近命中、未命中、相交和可调用着色器中使用这些 BuiltIn 变量时,应用程序必须使用 Volatile 语义。同样,应用程序必须对在相交着色器中使用的任何带有 RayTmaxKHR 修饰的 Builtin 使用 Volatile 语义。

子组操作在可编程的光线追踪着色器阶段中是允许的。但是,着色器调用指令对子组指令或执行该指令的动态实例的子组范围指令的结果的潜在有效位置设置了限制。例如,在调用重新打包指令之后使用在该指令之前计算的投票操作的结果时,必须小心。投票结果可能不正确,因为调用集可能已更改。

尽管要求将 SubgroupSize 内置变量声明为 Volatile,但除非在管道创建时设置了 VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT,否则其值永远不会更改,因为在不设置该位的情况下,其值必须与 VkPhysicalDeviceSubgroupProperties::subgroupSize 的值匹配。

对于时钟操作,不将在重新打包指令的动态实例之前读取的 Subgroup 范围的 OpReadClockKHR 的值与重新打包指令之后该时钟指令的结果进行比较。

当光线追踪着色器执行一个调用重新打包指令的动态实例,该指令导致另一个光线追踪着色器被调用时,它们的指令通过 着色器调用顺序 相关联。

对于着色器调用相关的光线追踪调用

  • StorageBufferImageShaderRecordBufferKHR 存储类别的 内存操作可以使用 ShaderCallKHR 范围进行同步。

  • CallableDataKHRIncomingCallableDataKHRRayPayloadKHRHitAttributeKHRIncomingRayPayloadKHR 存储类别是 系统同步的,不需要应用程序的可用性和可见性操作。

  • 着色器调用指令之前和之后单个调用中的内存操作按程序顺序排序,不需要显式同步。

光线追踪命令

光线追踪命令 在光线追踪管道中引发工作。光线追踪命令被记录到命令缓冲区中,并且当由队列执行时,将产生根据绑定的光线追踪管道执行的工作。在将任何光线追踪命令记录到该命令缓冲区之前,必须将光线追踪管道绑定到命令缓冲区。

要调度光线追踪,请使用

// Provided by VK_NV_ray_tracing
void vkCmdTraceRaysNV(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    raygenShaderBindingTableBuffer,
    VkDeviceSize                                raygenShaderBindingOffset,
    VkBuffer                                    missShaderBindingTableBuffer,
    VkDeviceSize                                missShaderBindingOffset,
    VkDeviceSize                                missShaderBindingStride,
    VkBuffer                                    hitShaderBindingTableBuffer,
    VkDeviceSize                                hitShaderBindingOffset,
    VkDeviceSize                                hitShaderBindingStride,
    VkBuffer                                    callableShaderBindingTableBuffer,
    VkDeviceSize                                callableShaderBindingOffset,
    VkDeviceSize                                callableShaderBindingStride,
    uint32_t                                    width,
    uint32_t                                    height,
    uint32_t                                    depth);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • raygenShaderBindingTableBuffer 是保存光线生成着色器阶段的着色器绑定表数据的缓冲区对象。

  • raygenShaderBindingOffset 是光线生成着色器用于追踪的字节偏移量(相对于 raygenShaderBindingTableBuffer)。

  • missShaderBindingTableBuffer 是保存未命中着色器阶段的着色器绑定表数据的缓冲区对象。

  • missShaderBindingOffset 是未命中着色器用于追踪的字节偏移量(相对于 missShaderBindingTableBuffer)。

  • missShaderBindingStridemissShaderBindingTableBuffer 中每个着色器绑定表记录的字节大小。

  • hitShaderBindingTableBuffer 是保存命中着色器阶段的着色器绑定表数据的缓冲区对象。

  • hitShaderBindingOffset 是命中着色器组用于追踪的字节偏移量(相对于 hitShaderBindingTableBuffer)。

  • hitShaderBindingStridehitShaderBindingTableBuffer 中每个着色器绑定表记录的字节大小。

  • callableShaderBindingTableBuffer 是保存可调用着色器阶段的着色器绑定表数据的缓冲区对象。

  • callableShaderBindingOffset 是可调用着色器用于追踪的字节偏移量(相对于 callableShaderBindingTableBuffer)。

  • callableShaderBindingStridecallableShaderBindingTableBuffer 中每个着色器绑定表记录的字节大小。

  • width 是光线追踪查询维度的宽度。

  • height 是光线追踪查询维度的高度。

  • depth 是光线追踪查询维度的深度。

当命令执行时,会组装一个 width × height × depth 条光线的光线生成组。

有效用法
  • VUID-vkCmdTraceRaysNV-magFilter-04553
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysNV-magFilter-09598
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysNV-mipmapMode-04770
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,并且 compareEnable 等于 VK_FALSE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysNV-mipmapMode-09599
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEAR,并且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysNV-unnormalizedCoordinates-09635
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 levelCountlayerCount 必须 为 1。

  • VUID-vkCmdTraceRaysNV-None-08609
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdTraceRaysNV-None-08610
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何 SPIR-V 的 OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdTraceRaysNV-None-08611
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysNV-None-06479
    如果一个 VkImageView 被用于深度比较采样,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdTraceRaysNV-None-02691
    如果一个 VkImageView 作为此命令的结果被原子操作访问,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdTraceRaysNV-None-07888
    如果一个 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果被原子操作访问,那么该存储纹理缓冲区的 格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdTraceRaysNV-None-02692
    如果一个 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdTraceRaysNV-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdTraceRaysNV-filterCubic-02694
    任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须具有支持三次过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysNV-filterCubicMinmax-02695
    任何使用 VK_FILTER_CUBIC_EXT 采样且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView ,作为此命令的结果,必须具有支持三次过滤以及最小值/最大值过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysNV-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,那么任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdTraceRaysNV-reductionMode-09213
    任何使用 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM 采样的 VkImageView ,作为此命令的结果,必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdTraceRaysNV-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageViewVkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 必须等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdTraceRaysNV-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果作为此命令的结果被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdTraceRaysNV-OpTypeImage-07027
    对于任何作为存储图像写入的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysNV-OpTypeImage-07028
    对于任何作为存储图像读取的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysNV-OpTypeImage-07029
    对于任何作为存储纹理缓冲写入的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysNV-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysNV-None-08600
    对于 绑定着色器 静态使用的每个集合 _n_,一个描述符集必须在同一流水线绑定点绑定到 _n_,并使用与集合 _n_ 兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysNV-None-08601
    对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysNV-None-10068
    对于 绑定着色器 使用的每个资源数组,用于访问数组成员的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数。

  • VUID-vkCmdTraceRaysNV-maintenance4-08602
    如果未启用 maintenance4 功能,那么对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysNV-None-08114
    通过 vkCmdBindDescriptorSets 指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 静态使用,并且绑定的 VkPipeline 不是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须描述符有效性 中所述是有效的。

  • VUID-vkCmdTraceRaysNV-None-08115
    如果绑定到流水线绑定点的 VkPipeline 使用的描述符是通过 vkCmdBindDescriptorSets 指定的,则绑定的 VkPipeline 必须是在没有 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 的情况下创建的。

  • VUID-vkCmdTraceRaysNV-None-08116
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 动态使用,并且绑定的 VkPipeline 是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须是有效的。

  • VUID-vkCmdTraceRaysNV-None-08604
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到与此命令使用的流水线绑定点对应的阶段的任何 VkShaderEXT 动态使用,则必须是有效的。

  • VUID-vkCmdTraceRaysNV-None-08117
    如果绑定到管线绑定点的 VkPipeline 使用的描述符是通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的,则绑定的 VkPipeline 必须使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建。

  • VUID-vkCmdTraceRaysNV-None-08119
    如果一个描述符被动态地用于使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkPipeline,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysNV-None-08605
    如果一个描述符被动态地用于使用使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkDescriptorSetLayout 创建的 VkShaderEXT,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysNV-None-08606
    如果 shaderObject 功能未启用,则必须将有效的管线绑定到此命令使用的管线绑定点。

  • VUID-vkCmdTraceRaysNV-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自绑定该管线以来,必须没有对在该管线绑定点绑定的 VkPipeline 对象中静态指定的任何状态调用动态状态设置命令。

  • VUID-vkCmdTraceRaysNV-None-08607
    如果启用了 shaderObject 功能,则必须将有效的管线绑定到此命令使用的管线绑定点,或者必须将有效的和 VK_NULL_HANDLE 着色器对象的有效组合绑定到与此命令使用的管线绑定点对应的每个支持的着色器阶段。

  • VUID-vkCmdTraceRaysNV-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了统一缓冲区,并且该阶段的创建没有为 uniformBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysNV-None-08612
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了统一缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysNV-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了存储缓冲区,并且该阶段的创建没有为 storageBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysNV-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了存储缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysNV-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdTraceRaysNV-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysNV-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdTraceRaysNV-viewType-07752
    如果此命令导致访问了 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan 图像视图类型之间的兼容性中描述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdTraceRaysNV-format-07753
    如果此命令导致访问了 VkImageView,则图像视图的 format数字类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdTraceRaysNV-OpImageWrite-08795
    如果此命令导致使用 OpImageWrite 访问了使用 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdTraceRaysNV-OpImageWrite-08796
    如果此命令导致使用 OpImageWrite 访问了使用格式 VK_FORMAT_A8_UNORM 创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须有四个组件。

  • VUID-vkCmdTraceRaysNV-OpImageWrite-04469
    如果使用此命令的结果,通过 OpImageWrite 访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdTraceRaysNV-SampledType-04470
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysNV-SampledType-04471
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysNV-SampledType-04472
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysNV-SampledType-04473
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysNV-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysNV-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysNV-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysNV-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的样本权重图像,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysNV-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdTraceRaysNV-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysNV-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysNV-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysNV-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须已使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysNV-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysNV-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysNV-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式必须是单组件格式。

  • VUID-vkCmdTraceRaysNV-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysNV-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdTraceRaysNV-None-09600
    如果类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符由于此命令被访问,则由该描述符标识的所有图像子资源必须处于写入描述符时标识的图像布局中。

  • VUID-vkCmdTraceRaysNV-None-03429
    此调用引用的任何着色器组句柄必须是从绑定的光线追踪管线查询获得的。

  • VUID-vkCmdTraceRaysNV-None-09458
    如果绑定的光线追踪管线状态是启用了 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR 动态状态创建的,则在此跟踪命令之前,必须在当前命令缓冲区中调用 vkCmdSetRayTracingPipelineStackSizeKHR

  • VUID-vkCmdTraceRaysNV-commandBuffer-04624
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdTraceRaysNV-maxRecursionDepth-03625
    此命令不能导致从着色器调用执行管线跟踪光线指令,且该着色器调用的递归深度大于用于创建绑定光线追踪管线的 maxRecursionDepth 值。

  • VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-04042
    如果 raygenShaderBindingTableBuffer 是非稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455
    raygenShaderBindingOffset 必须小于 raygenShaderBindingTableBuffer 的大小。

  • VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456
    raygenShaderBindingOffset 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment 的倍数。

  • VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-04043
    如果 missShaderBindingTableBuffer 是非稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457
    missShaderBindingOffset 必须小于 missShaderBindingTableBuffer 的大小。

  • VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458
    missShaderBindingOffset 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment 的倍数。

  • VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-04044
    如果 hitShaderBindingTableBuffer 是非稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459
    hitShaderBindingOffset 必须小于 hitShaderBindingTableBuffer 的大小。

  • VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460
    hitShaderBindingOffset 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment 的倍数。

  • VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-04045
    如果 callableShaderBindingTableBuffer 是非稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461
    callableShaderBindingOffset 必须小于 callableShaderBindingTableBuffer 的大小。

  • VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462
    callableShaderBindingOffset 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment 的倍数。

  • VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463
    missShaderBindingStride 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize 的倍数。

  • VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464
    hitShaderBindingStride 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize 的倍数。

  • VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465
    callableShaderBindingStride 必须VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize 的倍数。

  • VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466
    missShaderBindingStride 必须小于或等于 VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride

  • VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467
    hitShaderBindingStride 必须小于或等于 VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride

  • VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468
    callableShaderBindingStride 必须小于或等于 VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride

  • VUID-vkCmdTraceRaysNV-width-02469
    width 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]。

  • VUID-vkCmdTraceRaysNV-height-02470
    height 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]。

  • VUID-vkCmdTraceRaysNV-depth-02471
    depth 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]。

有效使用(隐式)
  • VUID-vkCmdTraceRaysNV-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-parameter
    raygenShaderBindingTableBuffer 必须是一个有效的 VkBuffer 句柄。

  • VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-parameter
    如果 missShaderBindingTableBuffer 不是 VK_NULL_HANDLE,则 missShaderBindingTableBuffer 必须是一个有效的 VkBuffer 句柄。

  • VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-parameter
    如果 hitShaderBindingTableBuffer 不是 VK_NULL_HANDLE,则 hitShaderBindingTableBuffer 必须 是一个有效的 VkBuffer 句柄

  • VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-parameter
    如果 callableShaderBindingTableBuffer 不是 VK_NULL_HANDLE,则 callableShaderBindingTableBuffer 必须 是一个有效的 VkBuffer 句柄

  • VUID-vkCmdTraceRaysNV-commandBuffer-recording
    commandBuffer 必须 处于 录制状态

  • VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持计算操作

  • VUID-vkCmdTraceRaysNV-renderpass
    此命令必须仅在渲染通道实例之外调用

  • VUID-vkCmdTraceRaysNV-videocoding
    此命令必须仅在视频编码范围之外调用

  • VUID-vkCmdTraceRaysNV-commonparent
    callableShaderBindingTableBuffer, commandBuffer, hitShaderBindingTableBuffer, missShaderBindingTableBufferraygenShaderBindingTableBuffer 中,作为有效句柄的非忽略参数,必须是从同一个 VkDevice 创建、分配或检索的

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

要调度光线追踪,请使用

// Provided by VK_KHR_ray_tracing_pipeline
void vkCmdTraceRaysKHR(
    VkCommandBuffer                             commandBuffer,
    const VkStridedDeviceAddressRegionKHR*      pRaygenShaderBindingTable,
    const VkStridedDeviceAddressRegionKHR*      pMissShaderBindingTable,
    const VkStridedDeviceAddressRegionKHR*      pHitShaderBindingTable,
    const VkStridedDeviceAddressRegionKHR*      pCallableShaderBindingTable,
    uint32_t                                    width,
    uint32_t                                    height,
    uint32_t                                    depth);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • pRaygenShaderBindingTable 是一个 VkStridedDeviceAddressRegionKHR,它保存了光线生成着色器阶段的着色器绑定表数据。

  • pMissShaderBindingTable 是一个 VkStridedDeviceAddressRegionKHR,它保存了 Miss 着色器阶段的着色器绑定表数据。

  • pHitShaderBindingTable 是一个 VkStridedDeviceAddressRegionKHR,它保存了 Hit 着色器阶段的着色器绑定表数据。

  • pCallableShaderBindingTable 是一个 VkStridedDeviceAddressRegionKHR,它保存了可调用着色器阶段的着色器绑定表数据。

  • width 是光线追踪查询维度的宽度。

  • height 是光线追踪查询维度的高度。

  • depth 是光线追踪查询维度的深度。

当命令执行时,会组装一个 width × height × depth 条光线的光线生成组。

有效用法
  • VUID-vkCmdTraceRaysKHR-magFilter-04553
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysKHR-magFilter-09598
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysKHR-mipmapMode-04770
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,并且 compareEnable 等于 VK_FALSE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysKHR-mipmapMode-09599
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEAR,并且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysKHR-unnormalizedCoordinates-09635
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 levelCountlayerCount 必须 为 1。

  • VUID-vkCmdTraceRaysKHR-None-08609
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdTraceRaysKHR-None-08610
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何 SPIR-V 的 OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdTraceRaysKHR-None-08611
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysKHR-None-06479
    如果一个 VkImageView 被用于深度比较采样,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdTraceRaysKHR-None-02691
    如果一个 VkImageView 作为此命令的结果被原子操作访问,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdTraceRaysKHR-None-07888
    如果一个 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果被原子操作访问,那么该存储纹理缓冲区的 格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdTraceRaysKHR-None-02692
    如果一个 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdTraceRaysKHR-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdTraceRaysKHR-filterCubic-02694
    任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须具有支持三次过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysKHR-filterCubicMinmax-02695
    任何使用 VK_FILTER_CUBIC_EXT 采样且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView ,作为此命令的结果,必须具有支持三次过滤以及最小值/最大值过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysKHR-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,那么任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdTraceRaysKHR-reductionMode-09213
    任何使用 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM 采样的 VkImageView ,作为此命令的结果,必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdTraceRaysKHR-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageViewVkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 必须等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdTraceRaysKHR-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果作为此命令的结果被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdTraceRaysKHR-OpTypeImage-07027
    对于任何作为存储图像写入的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysKHR-OpTypeImage-07028
    对于任何作为存储图像读取的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysKHR-OpTypeImage-07029
    对于任何作为存储纹理缓冲写入的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysKHR-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysKHR-None-08600
    对于 绑定着色器 静态使用的每个集合 _n_,一个描述符集必须在同一流水线绑定点绑定到 _n_,并使用与集合 _n_ 兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysKHR-None-08601
    对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysKHR-None-10068
    对于 绑定着色器 使用的每个资源数组,用于访问数组成员的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数。

  • VUID-vkCmdTraceRaysKHR-maintenance4-08602
    如果未启用 maintenance4 功能,那么对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysKHR-None-08114
    通过 vkCmdBindDescriptorSets 指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 静态使用,并且绑定的 VkPipeline 不是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须描述符有效性 中所述是有效的。

  • VUID-vkCmdTraceRaysKHR-None-08115
    如果绑定到流水线绑定点的 VkPipeline 使用的描述符是通过 vkCmdBindDescriptorSets 指定的,则绑定的 VkPipeline 必须是在没有 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 的情况下创建的。

  • VUID-vkCmdTraceRaysKHR-None-08116
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 动态使用,并且绑定的 VkPipeline 是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须是有效的。

  • VUID-vkCmdTraceRaysKHR-None-08604
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到与此命令使用的流水线绑定点对应的阶段的任何 VkShaderEXT 动态使用,则必须是有效的。

  • VUID-vkCmdTraceRaysKHR-None-08117
    如果绑定到管线绑定点的 VkPipeline 使用的描述符是通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的,则绑定的 VkPipeline 必须使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建。

  • VUID-vkCmdTraceRaysKHR-None-08119
    如果一个描述符被动态地用于使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkPipeline,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysKHR-None-08605
    如果一个描述符被动态地用于使用使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkDescriptorSetLayout 创建的 VkShaderEXT,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysKHR-None-08606
    如果 shaderObject 功能未启用,则必须将有效的管线绑定到此命令使用的管线绑定点。

  • VUID-vkCmdTraceRaysKHR-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自绑定该管线以来,必须没有对在该管线绑定点绑定的 VkPipeline 对象中静态指定的任何状态调用动态状态设置命令。

  • VUID-vkCmdTraceRaysKHR-None-08607
    如果启用了 shaderObject 功能,则必须将有效的管线绑定到此命令使用的管线绑定点,或者必须将有效的和 VK_NULL_HANDLE 着色器对象的有效组合绑定到与此命令使用的管线绑定点对应的每个支持的着色器阶段。

  • VUID-vkCmdTraceRaysKHR-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了统一缓冲区,并且该阶段的创建没有为 uniformBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysKHR-None-08612
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了统一缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysKHR-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了存储缓冲区,并且该阶段的创建没有为 storageBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysKHR-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了存储缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysKHR-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdTraceRaysKHR-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysKHR-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdTraceRaysKHR-viewType-07752
    如果此命令导致访问了 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan 图像视图类型之间的兼容性中描述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdTraceRaysKHR-format-07753
    如果此命令导致访问了 VkImageView,则图像视图的 format数字类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdTraceRaysKHR-OpImageWrite-08795
    如果此命令导致使用 OpImageWrite 访问了使用 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdTraceRaysKHR-OpImageWrite-08796
    如果此命令导致使用 OpImageWrite 访问了使用格式 VK_FORMAT_A8_UNORM 创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须有四个组件。

  • VUID-vkCmdTraceRaysKHR-OpImageWrite-04469
    如果使用此命令的结果,通过 OpImageWrite 访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdTraceRaysKHR-SampledType-04470
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysKHR-SampledType-04471
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysKHR-SampledType-04472
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysKHR-SampledType-04473
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysKHR-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysKHR-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysKHR-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysKHR-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的样本权重图像,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysKHR-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdTraceRaysKHR-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysKHR-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysKHR-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysKHR-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须已使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysKHR-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysKHR-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysKHR-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式必须是单组件格式。

  • VUID-vkCmdTraceRaysKHR-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysKHR-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdTraceRaysKHR-None-09600
    如果类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符由于此命令被访问,则由该描述符标识的所有图像子资源必须处于写入描述符时标识的图像布局中。

  • VUID-vkCmdTraceRaysKHR-None-03429
    此调用引用的任何着色器组句柄必须是从绑定的光线追踪管线查询获得的。

  • VUID-vkCmdTraceRaysKHR-None-09458
    如果绑定的光线追踪管线状态是启用了 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR 动态状态创建的,则在此跟踪命令之前,必须在当前命令缓冲区中调用 vkCmdSetRayTracingPipelineStackSizeKHR

  • VUID-vkCmdTraceRaysKHR-maxPipelineRayRecursionDepth-03679
    此命令必须不能导致着色器调用指令从具有大于用于创建绑定的光线追踪管线的maxPipelineRayRecursionDepth值的递归深度的着色器调用中执行

  • VUID-vkCmdTraceRaysKHR-commandBuffer-03635
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdTraceRaysKHR-size-04023
    pRayGenShaderBindingTablesize 成员必须等于其 stride 成员

  • VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-03680
    如果从中查询 pRayGenShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-03681
    从中查询 pRayGenShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-03682
    pRayGenShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-03683
    如果从中查询 pMissShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-03684
    从中查询 pMissShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-03685
    pMissShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-stride-03686
    pMissShaderBindingTable->stride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-stride-04029
    pMissShaderBindingTable->stride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-03687
    如果从中查询 pHitShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-03688
    从中查询 pHitShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-03689
    pHitShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-stride-03690
    pHitShaderBindingTable->stride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-stride-04035
    pHitShaderBindingTable->stride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-03691
    如果从中查询 pCallableShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-03692
    从中查询 pCallableShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-03693
    pCallableShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-stride-03694
    pCallableShaderBindingTable->stride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-vkCmdTraceRaysKHR-stride-04041
    pCallableShaderBindingTable->stride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-vkCmdTraceRaysKHR-flags-03696
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHRflags 中创建的,则 pHitShaderBindingTable->deviceAddress 必须不为零

  • VUID-vkCmdTraceRaysKHR-flags-03697
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHRflags 中创建的,则 pHitShaderBindingTable->deviceAddress 必须不为零

  • VUID-vkCmdTraceRaysKHR-flags-03511
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHRflags 中创建的,则由 pMissShaderBindingTable->deviceAddress 标识的着色器组句柄必须不为零

  • VUID-vkCmdTraceRaysKHR-flags-03512
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHRflags 中创建的,则由 pHitShaderBindingTable->deviceAddress 标识的表中,为了执行 any-hit 着色器而访问的条目必须不为零

  • VUID-vkCmdTraceRaysKHR-flags-03513
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHRflags 中创建的,则由 pHitShaderBindingTable->deviceAddress 标识的表中,为了执行 closest hit 着色器而访问的条目必须不为零

  • VUID-vkCmdTraceRaysKHR-flags-03514
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHRflags 中创建的,则由 pHitShaderBindingTable->deviceAddress 标识的表中,为了执行 intersection 着色器而访问的条目必须不为零

  • VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-04735
    通过此调用从 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR 的几何体访问的、由 pHitShaderBindingTable->deviceAddress 标识的表中任何非零的 hit 着色器组条目,必须已使用 VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR 创建

  • VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-04736
    通过此调用从 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR 的几何体访问的、由 pHitShaderBindingTable->deviceAddress 标识的表中任何非零的 hit 着色器组条目,必须已使用 VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR 创建

  • VUID-vkCmdTraceRaysKHR-width-03638
    width 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[0]

  • VUID-vkCmdTraceRaysKHR-height-03639
    height 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[1]

  • VUID-vkCmdTraceRaysKHR-depth-03640
    depth 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[2]

  • VUID-vkCmdTraceRaysKHR-width-03641
    width × height × depth 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxRayDispatchInvocationCount

有效使用(隐式)
  • VUID-vkCmdTraceRaysKHR-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdTraceRaysKHR-pRaygenShaderBindingTable-parameter
    pRaygenShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-parameter
    pMissShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-parameter
    pHitShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-parameter
    pCallableShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysKHR-commandBuffer-recording
    commandBuffer 必须 处于 录制状态

  • VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持计算操作

  • VUID-vkCmdTraceRaysKHR-renderpass
    此命令必须仅在渲染通道实例之外调用

  • VUID-vkCmdTraceRaysKHR-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

当绑定的光线追踪管线启用调用掩码图像时,该管线将使用命令指定的调用掩码图像

// Provided by VK_HUAWEI_invocation_mask
void vkCmdBindInvocationMaskHUAWEI(
    VkCommandBuffer                             commandBuffer,
    VkImageView                                 imageView,
    VkImageLayout                               imageLayout);
  • commandBuffer 是将记录命令的命令缓冲区

  • imageView 是一个图像视图句柄,指定调用掩码图像。imageView 可以VK_NULL_HANDLE,这等效于指定一个填充为 1 的值的图像视图。

  • imageLayout 是当访问调用掩码图像时,可从 imageView 访问的图像子资源的布局。

有效用法
  • VUID-vkCmdBindInvocationMaskHUAWEI-None-04976
    invocationMask 功能必须启用。

  • VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04977
    如果 imageView 不是 VK_NULL_HANDLE,则它必须是类型为 VK_IMAGE_VIEW_TYPE_2D 的有效 VkImageView 句柄。

  • VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04978
    如果 imageView 不是 VK_NULL_HANDLE,则它必须具有 VK_FORMAT_R8_UINT 格式。

  • VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04979
    如果 imageView 不是 VK_NULL_HANDLE,则它必须使用设置的 VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI 创建。

  • VUID-vkCmdBindInvocationMaskHUAWEI-imageView-04980
    如果 imageView 不是 VK_NULL_HANDLE,则 imageLayout 必须VK_IMAGE_LAYOUT_GENERAL

  • VUID-vkCmdBindInvocationMaskHUAWEI-width-04981
    线程掩码图像分辨率必须vkCmdTraceRaysKHR 中的 widthheight 匹配。

  • VUID-vkCmdBindInvocationMaskHUAWEI-None-04982
    调用掩码图像中的每个元素必须具有值 01。值 1 表示调用处于活动状态。

  • VUID-vkCmdBindInvocationMaskHUAWEI-depth-04983
    vkCmdTraceRaysKHR 中的 depth 必须为 1。

有效使用(隐式)
  • VUID-vkCmdBindInvocationMaskHUAWEI-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdBindInvocationMaskHUAWEI-imageView-parameter
    如果 imageView 不是 VK_NULL_HANDLE,则 imageView 必须是有效的 VkImageView 句柄。

  • VUID-vkCmdBindInvocationMaskHUAWEI-imageLayout-parameter
    imageLayout 必须是有效的 VkImageLayout 值。

  • VUID-vkCmdBindInvocationMaskHUAWEI-commandBuffer-recording
    commandBuffer 必须 处于 录制状态

  • VUID-vkCmdBindInvocationMaskHUAWEI-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持计算操作

  • VUID-vkCmdBindInvocationMaskHUAWEI-renderpass
    此命令必须仅在渲染通道实例之外调用

  • VUID-vkCmdBindInvocationMaskHUAWEI-videocoding
    此命令必须仅在视频编码范围之外调用

  • VUID-vkCmdBindInvocationMaskHUAWEI-commonparent
    commandBufferimageView 中作为非忽略参数的有效句柄都必须从同一个 VkDevice 创建、分配或检索。

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

要调度光线追踪,并在设备上获取一些参数,请使用

// Provided by VK_KHR_ray_tracing_pipeline
void vkCmdTraceRaysIndirectKHR(
    VkCommandBuffer                             commandBuffer,
    const VkStridedDeviceAddressRegionKHR*      pRaygenShaderBindingTable,
    const VkStridedDeviceAddressRegionKHR*      pMissShaderBindingTable,
    const VkStridedDeviceAddressRegionKHR*      pHitShaderBindingTable,
    const VkStridedDeviceAddressRegionKHR*      pCallableShaderBindingTable,
    VkDeviceAddress                             indirectDeviceAddress);

vkCmdTraceRaysIndirectKHR 的行为类似于 vkCmdTraceRaysKHR,不同之处在于,光线追踪查询维度是在执行期间由设备从 indirectDeviceAddress 读取的。

有效用法
  • VUID-vkCmdTraceRaysIndirectKHR-magFilter-04553
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-magFilter-09598
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-mipmapMode-04770
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,并且 compareEnable 等于 VK_FALSE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-mipmapMode-09599
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEAR,并且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-unnormalizedCoordinates-09635
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 levelCountlayerCount 必须 为 1。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08609
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdTraceRaysIndirectKHR-None-08610
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何 SPIR-V 的 OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdTraceRaysIndirectKHR-None-08611
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysIndirectKHR-None-06479
    如果一个 VkImageView 被用于深度比较采样,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-None-02691
    如果一个 VkImageView 作为此命令的结果被原子操作访问,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-None-07888
    如果一个 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果被原子操作访问,那么该存储纹理缓冲区的 格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-None-02692
    如果一个 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdTraceRaysIndirectKHR-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdTraceRaysIndirectKHR-filterCubic-02694
    任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须具有支持三次过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysIndirectKHR-filterCubicMinmax-02695
    任何使用 VK_FILTER_CUBIC_EXT 采样且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView ,作为此命令的结果,必须具有支持三次过滤以及最小值/最大值过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysIndirectKHR-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,那么任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdTraceRaysIndirectKHR-reductionMode-09213
    任何使用 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM 采样的 VkImageView ,作为此命令的结果,必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdTraceRaysIndirectKHR-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageViewVkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 必须等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果作为此命令的结果被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdTraceRaysIndirectKHR-OpTypeImage-07027
    对于任何作为存储图像写入的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-OpTypeImage-07028
    对于任何作为存储图像读取的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-OpTypeImage-07029
    对于任何作为存储纹理缓冲写入的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirectKHR-None-08600
    对于 绑定着色器 静态使用的每个集合 _n_,一个描述符集必须在同一流水线绑定点绑定到 _n_,并使用与集合 _n_ 兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08601
    对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysIndirectKHR-None-10068
    对于 绑定着色器 使用的每个资源数组,用于访问数组成员的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数。

  • VUID-vkCmdTraceRaysIndirectKHR-maintenance4-08602
    如果未启用 maintenance4 功能,那么对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08114
    通过 vkCmdBindDescriptorSets 指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 静态使用,并且绑定的 VkPipeline 不是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须描述符有效性 中所述是有效的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08115
    如果绑定到流水线绑定点的 VkPipeline 使用的描述符是通过 vkCmdBindDescriptorSets 指定的,则绑定的 VkPipeline 必须是在没有 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 的情况下创建的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08116
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 动态使用,并且绑定的 VkPipeline 是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须是有效的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08604
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到与此命令使用的流水线绑定点对应的阶段的任何 VkShaderEXT 动态使用,则必须是有效的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08117
    如果绑定到管线绑定点的 VkPipeline 使用的描述符是通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的,则绑定的 VkPipeline 必须使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08119
    如果一个描述符被动态地用于使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkPipeline,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08605
    如果一个描述符被动态地用于使用使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkDescriptorSetLayout 创建的 VkShaderEXT,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08606
    如果 shaderObject 功能未启用,则必须将有效的管线绑定到此命令使用的管线绑定点。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自绑定该管线以来,必须没有对在该管线绑定点绑定的 VkPipeline 对象中静态指定的任何状态调用动态状态设置命令。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08607
    如果启用了 shaderObject 功能,则必须将有效的管线绑定到此命令使用的管线绑定点,或者必须将有效的和 VK_NULL_HANDLE 着色器对象的有效组合绑定到与此命令使用的管线绑定点对应的每个支持的着色器阶段。

  • VUID-vkCmdTraceRaysIndirectKHR-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了统一缓冲区,并且该阶段的创建没有为 uniformBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08612
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了统一缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirectKHR-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了存储缓冲区,并且该阶段的创建没有为 storageBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirectKHR-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了存储缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdTraceRaysIndirectKHR-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysIndirectKHR-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdTraceRaysIndirectKHR-viewType-07752
    如果此命令导致访问了 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan 图像视图类型之间的兼容性中描述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdTraceRaysIndirectKHR-format-07753
    如果此命令导致访问了 VkImageView,则图像视图的 format数字类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWrite-08795
    如果此命令导致使用 OpImageWrite 访问了使用 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWrite-08796
    如果此命令导致使用 OpImageWrite 访问了使用格式 VK_FORMAT_A8_UNORM 创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须有四个组件。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWrite-04469
    如果使用此命令的结果,通过 OpImageWrite 访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdTraceRaysIndirectKHR-SampledType-04470
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysIndirectKHR-SampledType-04471
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysIndirectKHR-SampledType-04472
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysIndirectKHR-SampledType-04473
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysIndirectKHR-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysIndirectKHR-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的样本权重图像,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须已使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式必须是单组件格式。

  • VUID-vkCmdTraceRaysIndirectKHR-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysIndirectKHR-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdTraceRaysIndirectKHR-None-09600
    如果类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符由于此命令被访问,则由该描述符标识的所有图像子资源必须处于写入描述符时标识的图像布局中。

  • VUID-vkCmdTraceRaysIndirectKHR-None-03429
    此调用引用的任何着色器组句柄必须是从绑定的光线追踪管线查询获得的。

  • VUID-vkCmdTraceRaysIndirectKHR-None-09458
    如果绑定的光线追踪管线状态是启用了 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR 动态状态创建的,则在此跟踪命令之前,必须在当前命令缓冲区中调用 vkCmdSetRayTracingPipelineStackSizeKHR

  • VUID-vkCmdTraceRaysIndirectKHR-maxPipelineRayRecursionDepth-03679
    此命令必须不能导致着色器调用指令从具有大于用于创建绑定的光线追踪管线的maxPipelineRayRecursionDepth值的递归深度的着色器调用中执行

  • VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-03635
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdTraceRaysIndirectKHR-size-04023
    pRayGenShaderBindingTablesize 成员必须等于其 stride 成员

  • VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-03680
    如果从中查询 pRayGenShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-03681
    从中查询 pRayGenShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-03682
    pRayGenShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-03683
    如果从中查询 pMissShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-03684
    从中查询 pMissShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-03685
    pMissShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-stride-03686
    pMissShaderBindingTable->stride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-stride-04029
    pMissShaderBindingTable->stride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-03687
    如果从中查询 pHitShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-03688
    从中查询 pHitShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-03689
    pHitShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-stride-03690
    pHitShaderBindingTable->stride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-stride-04035
    pHitShaderBindingTable->stride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-03691
    如果从中查询 pCallableShaderBindingTable->deviceAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-03692
    从中查询 pCallableShaderBindingTable->deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-03693
    pCallableShaderBindingTable->deviceAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-stride-03694
    pCallableShaderBindingTable->stride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-vkCmdTraceRaysIndirectKHR-stride-04041
    pCallableShaderBindingTable->stride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-vkCmdTraceRaysIndirectKHR-flags-03696
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHRflags 中创建的,则 pHitShaderBindingTable->deviceAddress 必须不为零

  • VUID-vkCmdTraceRaysIndirectKHR-flags-03697
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHRflags 中创建的,则 pHitShaderBindingTable->deviceAddress 必须不为零

  • VUID-vkCmdTraceRaysIndirectKHR-flags-03511
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHRflags 中创建的,则由 pMissShaderBindingTable->deviceAddress 标识的着色器组句柄必须不为零

  • VUID-vkCmdTraceRaysIndirectKHR-flags-03512
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHRflags 中创建的,则由 pHitShaderBindingTable->deviceAddress 标识的表中,为了执行 any-hit 着色器而访问的条目必须不为零

  • VUID-vkCmdTraceRaysIndirectKHR-flags-03513
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHRflags 中创建的,则由 pHitShaderBindingTable->deviceAddress 标识的表中,为了执行 closest hit 着色器而访问的条目必须不为零

  • VUID-vkCmdTraceRaysIndirectKHR-flags-03514
    如果绑定的光线追踪管线是在包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHRflags 中创建的,则由 pHitShaderBindingTable->deviceAddress 标识的表中,为了执行 intersection 着色器而访问的条目必须不为零

  • VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-04735
    通过此调用从 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR 的几何体访问的、由 pHitShaderBindingTable->deviceAddress 标识的表中任何非零的 hit 着色器组条目,必须已使用 VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR 创建

  • VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-04736
    通过此调用从 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR 的几何体访问的、由 pHitShaderBindingTable->deviceAddress 标识的表中任何非零的 hit 着色器组条目,必须已使用 VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR 创建

  • VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03632
    如果从中查询 indirectDeviceAddress 的缓冲区是非稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03633
    从中查询 indirectDeviceAddress 的缓冲区必须在创建时设置了 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位。

  • VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03634
    indirectDeviceAddress 必须4 的倍数。

  • VUID-vkCmdTraceRaysIndirectKHR-indirectDeviceAddress-03636
    indirectDeviceAddressindirectDeviceAddress + sizeof(VkTraceRaysIndirectCommandKHR) - 1 之间的所有设备地址必须在同一缓冲区的缓冲区设备地址范围内。

  • VUID-vkCmdTraceRaysIndirectKHR-rayTracingPipelineTraceRaysIndirect-03637
    必须启用 rayTracingPipelineTraceRaysIndirect 功能。

  • VUID-vkCmdTraceRaysIndirectKHR-rayTracingMotionBlurPipelineTraceRaysIndirect-04951
    如果绑定的光线追踪管线是使用 VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV 创建的,则必须启用 VkPhysicalDeviceRayTracingMotionBlurFeaturesNV::rayTracingMotionBlurPipelineTraceRaysIndirect 功能。

有效使用(隐式)
  • VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdTraceRaysIndirectKHR-pRaygenShaderBindingTable-parameter
    pRaygenShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-parameter
    pMissShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-parameter
    pHitShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-parameter
    pCallableShaderBindingTable 必须是指向有效 VkStridedDeviceAddressRegionKHR 结构的有效指针

  • VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-recording
    commandBuffer 必须 处于 录制状态

  • VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持计算操作

  • VUID-vkCmdTraceRaysIndirectKHR-renderpass
    此命令必须仅在渲染通道实例之外调用

  • VUID-vkCmdTraceRaysIndirectKHR-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

VkTraceRaysIndirectCommandKHR 结构定义如下:

// Provided by VK_KHR_ray_tracing_pipeline
typedef struct VkTraceRaysIndirectCommandKHR {
    uint32_t    width;
    uint32_t    height;
    uint32_t    depth;
} VkTraceRaysIndirectCommandKHR;
  • width 是光线追踪查询维度的宽度。

  • height 是光线追踪查询维度的高度。

  • depth 是光线追踪查询维度的深度。

VkTraceRaysIndirectCommandKHR 的成员与 vkCmdTraceRaysKHR 中类似命名的参数具有相同的含义。

有效用法
  • VUID-VkTraceRaysIndirectCommandKHR-width-03638
    width 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[0]

  • VUID-VkTraceRaysIndirectCommandKHR-height-03639
    height 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[1]

  • VUID-VkTraceRaysIndirectCommandKHR-depth-03640
    depth 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[2]

  • VUID-VkTraceRaysIndirectCommandKHR-width-03641
    width × height × depth 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxRayDispatchInvocationCount

要调度光线追踪,并在设备上获取一些参数,请使用

// Provided by VK_KHR_ray_tracing_maintenance1 with VK_KHR_ray_tracing_pipeline
void vkCmdTraceRaysIndirect2KHR(
    VkCommandBuffer                             commandBuffer,
    VkDeviceAddress                             indirectDeviceAddress);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • indirectDeviceAddress 是一个缓冲区设备地址,它是一个指向包含光线追踪参数的 VkTraceRaysIndirectCommand2KHR 结构的指针。

vkCmdTraceRaysIndirect2KHR 的行为类似于 vkCmdTraceRaysIndirectKHR,区别在于着色器绑定表参数以及调度维度是在执行期间由设备从 indirectDeviceAddress 读取的。

有效用法
  • VUID-vkCmdTraceRaysIndirect2KHR-magFilter-04553
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGEcompareEnable 等于 VK_FALSE 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-magFilter-09598
    如果将一个 magFilterminFilter 等于 VK_FILTER_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX 创建的 VkSampler 用于采样一个 VkImageView 作为此命令的结果,则图像视图的格式特性必须包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-mipmapMode-04770
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEARreductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,并且 compareEnable 等于 VK_FALSE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-mipmapMode-09599
    如果使用一个 VkSampler ,其创建时的 mipmapMode 等于 VK_SAMPLER_MIPMAP_MODE_LINEAR,并且 reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAX,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-unnormalizedCoordinates-09635
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 levelCountlayerCount 必须 为 1。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08609
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该图像视图的 viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08610
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何 SPIR-V 的 OpImageSample*OpImageSparseSample* 指令一起使用,这些指令的名称中包含 ImplicitLodDrefProj

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08611
    如果使用一个 VkSampler ,其创建时的 unnormalizedCoordinates 等于 VK_TRUE,来采样一个 VkImageView,作为此命令的结果,那么该采样器 必须 不能与任何包含 LOD 偏差或任何偏移值的 SPIR-V OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-06479
    如果一个 VkImageView 被用于深度比较采样,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-None-02691
    如果一个 VkImageView 作为此命令的结果被原子操作访问,那么该图像视图的格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-None-07888
    如果一个 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER 描述符作为此命令的结果被原子操作访问,那么该存储纹理缓冲区的 格式特性 必须 包含 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-None-02692
    如果一个 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,那么该图像视图的 格式特性 必须 包含 VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT

  • VUID-vkCmdTraceRaysIndirect2KHR-None-02693
    如果未启用 VK_EXT_filter_cubic 扩展,并且任何 VkImageView 使用 VK_FILTER_CUBIC_EXT 进行采样,作为此命令的结果,它必须不具有 VK_IMAGE_VIEW_TYPE_3DVK_IMAGE_VIEW_TYPE_CUBEVK_IMAGE_VIEW_TYPE_CUBE_ARRAYVkImageViewType

  • VUID-vkCmdTraceRaysIndirect2KHR-filterCubic-02694
    任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须具有支持三次过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysIndirect2KHR-filterCubicMinmax-02695
    任何使用 VK_FILTER_CUBIC_EXT 采样且缩减模式为 VK_SAMPLER_REDUCTION_MODE_MINVK_SAMPLER_REDUCTION_MODE_MAXVkImageView ,作为此命令的结果,必须具有支持三次过滤以及最小值/最大值过滤的 VkImageViewType 和格式,如 VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax 所指定,该值由 vkGetPhysicalDeviceImageFormatProperties2 返回。

  • VUID-vkCmdTraceRaysIndirect2KHR-cubicRangeClamp-09212
    如果未启用 cubicRangeClamp 功能,那么任何使用 VK_FILTER_CUBIC_EXT 采样的 VkImageView ,作为此命令的结果,必须不具有等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOMVkSamplerReductionModeCreateInfo::reductionMode

  • VUID-vkCmdTraceRaysIndirect2KHR-reductionMode-09213
    任何使用 VkSamplerReductionModeCreateInfo::reductionMode 等于 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM 采样的 VkImageView ,作为此命令的结果,必须使用 VK_FILTER_CUBIC_EXT 进行采样。

  • VUID-vkCmdTraceRaysIndirect2KHR-selectableCubicWeights-09214
    如果未启用 selectableCubicWeights 功能,则此命令采样的任何使用 VK_FILTER_CUBIC_EXTVkImageViewVkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 必须等于 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-flags-02696
    任何使用包含 VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NVVkImageCreateInfo::flags 创建的 VkImage,如果作为此命令的结果被采样,则必须仅使用 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVkSamplerAddressMode 进行采样。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpTypeImage-07027
    对于任何作为存储图像写入的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-OpTypeImage-07028
    对于任何作为存储图像读取的 VkImageView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的格式特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-OpTypeImage-07029
    对于任何作为存储纹理缓冲写入的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-OpTypeImage-07030
    任何作为存储纹理缓冲读取的 VkBufferView,如果 OpTypeImage 的图像格式字段为 Unknown,则该视图的缓冲特性必须包含 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08600
    对于 绑定着色器 静态使用的每个集合 _n_,一个描述符集必须在同一流水线绑定点绑定到 _n_,并使用与集合 _n_ 兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08601
    对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayout 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-10068
    对于 绑定着色器 使用的每个资源数组,用于访问数组成员的索引必须小于此命令使用的描述符集中标识的绑定的描述符计数。

  • VUID-vkCmdTraceRaysIndirect2KHR-maintenance4-08602
    如果未启用 maintenance4 功能,那么对于 绑定着色器 静态使用的每个推送常量,一个推送常量值必须在相同的流水线绑定点设置,使用与推送常量兼容的 VkPipelineLayout,该 VkPipelineLayout 用于创建当前的 VkPipeline 或用于创建当前的 VkShaderEXTVkDescriptorSetLayoutVkPushConstantRange 数组,如 流水线布局兼容性 中所述。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08114
    通过 vkCmdBindDescriptorSets 指定的每个绑定描述符集中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 静态使用,并且绑定的 VkPipeline 不是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须描述符有效性 中所述是有效的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08115
    如果绑定到流水线绑定点的 VkPipeline 使用的描述符是通过 vkCmdBindDescriptorSets 指定的,则绑定的 VkPipeline 必须是在没有 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 的情况下创建的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08116
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到此命令使用的流水线绑定点的 VkPipeline 动态使用,并且绑定的 VkPipeline 是使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的,则必须是有效的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08604
    通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的绑定描述符缓冲区中的描述符,如果它们被绑定到与此命令使用的流水线绑定点对应的阶段的任何 VkShaderEXT 动态使用,则必须是有效的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08117
    如果绑定到管线绑定点的 VkPipeline 使用的描述符是通过 vkCmdSetDescriptorBufferOffsetsEXT 指定的,则绑定的 VkPipeline 必须使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08119
    如果一个描述符被动态地用于使用 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkPipeline,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08605
    如果一个描述符被动态地用于使用使用 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT 创建的 VkDescriptorSetLayout 创建的 VkShaderEXT,则该描述符内存必须是常驻的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08606
    如果 shaderObject 功能未启用,则必须将有效的管线绑定到此命令使用的管线绑定点。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08608
    如果将管线绑定到此命令使用的管线绑定点,则自绑定该管线以来,必须没有对在该管线绑定点绑定的 VkPipeline 对象中静态指定的任何状态调用动态状态设置命令。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08607
    如果启用了 shaderObject 功能,则必须将有效的管线绑定到此命令使用的管线绑定点,或者必须将有效的和 VK_NULL_HANDLE 着色器对象的有效组合绑定到与此命令使用的管线绑定点对应的每个支持的着色器阶段。

  • VUID-vkCmdTraceRaysIndirect2KHR-uniformBuffers-06935
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了统一缓冲区,并且该阶段的创建没有为 uniformBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08612
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了统一缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirect2KHR-storageBuffers-06936
    如果绑定到此命令使用的管线绑定点的 VkPipeline 对象的任何阶段访问了存储缓冲区,并且该阶段的创建没有为 storageBuffers 启用 VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESSVK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 中的任何一个,并且未启用 robustBufferAccess 功能,则该阶段必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-08613
    如果未启用 robustBufferAccess 功能,并且绑定到与此命令使用的管线绑定点对应的阶段的任何 VkShaderEXT 访问了存储缓冲区,则它必须不访问超出绑定到同一管线绑定点的描述符集中指定的缓冲区范围的值。

  • VUID-vkCmdTraceRaysIndirect2KHR-commandBuffer-02707
    如果 commandBuffer 是一个未受保护的命令缓冲区,并且不支持 protectedNoFault,则 绑定的着色器 访问的任何资源必须不是受保护的资源。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-06550
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须仅与 OpImageSample*OpImageSparseSample* 指令一起使用。

  • VUID-vkCmdTraceRaysIndirect2KHR-ConstOffset-06551
    如果 绑定的着色器 访问启用了 采样器 Y′CBCR 转换VkSamplerVkImageView 对象,则该对象必须不使用 ConstOffsetOffset 操作数。

  • VUID-vkCmdTraceRaysIndirect2KHR-viewType-07752
    如果此命令导致访问了 VkImageView,则图像视图的 viewType 必须SPIR-V 图像维度和 Vulkan 图像视图类型之间的兼容性中描述的 OpTypeImageDim 操作数匹配。

  • VUID-vkCmdTraceRaysIndirect2KHR-format-07753
    如果此命令导致访问了 VkImageView,则图像视图的 format数字类型OpTypeImageSampled Type 操作数必须匹配。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWrite-08795
    如果此命令导致使用 OpImageWrite 访问了使用 VK_FORMAT_A8_UNORM 以外的格式创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须至少具有与图像视图格式一样多的组件。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWrite-08796
    如果此命令导致使用 OpImageWrite 访问了使用格式 VK_FORMAT_A8_UNORM 创建的 VkImageView,则该指令的 Texel 操作数的 Type 必须有四个组件。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWrite-04469
    如果使用此命令的结果,通过 OpImageWrite 访问 VkBufferView,则该指令的 Texel 操作数的 Type 必须至少具有与缓冲区视图格式一样多的组件。

  • VUID-vkCmdTraceRaysIndirect2KHR-SampledType-04470
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysIndirect2KHR-SampledType-04471
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkImageView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysIndirect2KHR-SampledType-04472
    如果使用此命令的结果访问具有 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 64 的 Width

  • VUID-vkCmdTraceRaysIndirect2KHR-SampledType-04473
    如果使用此命令的结果访问具有小于 64 位组件宽度的 VkFormatVkBufferView,则该指令的 OpTypeImage 操作数的 SampledType 必须具有 32 的 Width

  • VUID-vkCmdTraceRaysIndirect2KHR-sparseImageInt64Atomics-04474
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkImage 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysIndirect2KHR-sparseImageInt64Atomics-04475
    如果未启用 sparseImageInt64Atomics 功能,则使用 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT 标志创建的 VkBuffer 对象必须不通过此命令使用 Width 为 64 的 SampledTypeOpTypeImage 通过原子指令进行访问。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWeightedSampleQCOM-06971
    如果使用 OpImageWeightedSampleQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWeightedSampleQCOM-06972
    如果 OpImageWeightedSampleQCOM 使用 VkImageView 作为此命令结果的样本权重图像,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBoxFilterQCOM-06973
    如果使用 OpImageBoxFilterQCOM 对此命令的结果的 VkImageView 进行采样,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBlockMatchSSDQCOM-06974
    如果使用 OpImageBlockMatchSSDQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBlockMatchSADQCOM-06975
    如果使用 OpImageBlockMatchSADQCOM 从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBlockMatchSADQCOM-06976
    如果使用 OpImageBlockMatchSADQCOM 或 OpImageBlockMatchSSDQCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWeightedSampleQCOM-06977
    如果 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 使用 VkSampler 作为此命令的结果,则该采样器必须已使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageWeightedSampleQCOM-06978
    如果除 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 之外的任何命令使用 VkSampler 作为此命令的结果,则该采样器必须未使用 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 创建。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBlockMatchWindow-09215
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式特征 必须包含 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBlockMatchWindow-09216
    如果使用 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 指令从此命令的结果的 VkImageView 中读取数据,则该图像视图的格式必须是单组件格式。

  • VUID-vkCmdTraceRaysIndirect2KHR-OpImageBlockMatchWindow-09217
    如果 OpImageBlockMatchWindow*QCOMOpImageBlockMatchGather*QCOM 从此命令的结果的参考图像中读取数据,则指定的参考坐标必须不能使 整数纹素坐标验证 失败。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-07288
    此命令执行的任何着色器调用必须终止

  • VUID-vkCmdTraceRaysIndirect2KHR-None-09600
    如果类型等于 VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOMVK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOMVK_DESCRIPTOR_TYPE_SAMPLED_IMAGEVK_DESCRIPTOR_TYPE_STORAGE_IMAGEVK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT 的描述符由于此命令被访问,则由该描述符标识的所有图像子资源必须处于写入描述符时标识的图像布局中。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-03429
    此调用引用的任何着色器组句柄必须是从绑定的光线追踪管线查询获得的。

  • VUID-vkCmdTraceRaysIndirect2KHR-None-09458
    如果绑定的光线追踪管线状态是启用了 VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR 动态状态创建的,则在此跟踪命令之前,必须在当前命令缓冲区中调用 vkCmdSetRayTracingPipelineStackSizeKHR

  • VUID-vkCmdTraceRaysIndirect2KHR-maxPipelineRayRecursionDepth-03679
    此命令必须不能导致着色器调用指令从具有大于用于创建绑定的光线追踪管线的maxPipelineRayRecursionDepth值的递归深度的着色器调用中执行

  • VUID-vkCmdTraceRaysIndirect2KHR-commandBuffer-03635
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdTraceRaysIndirect2KHR-indirectDeviceAddress-03632
    如果从中查询 indirectDeviceAddress 的缓冲区是非稀疏的,那么它必须完整且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdTraceRaysIndirect2KHR-indirectDeviceAddress-03633
    从中查询 indirectDeviceAddress 的缓冲区必须在创建时设置了 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT 位。

  • VUID-vkCmdTraceRaysIndirect2KHR-indirectDeviceAddress-03634
    indirectDeviceAddress 必须4 的倍数。

  • VUID-vkCmdTraceRaysIndirect2KHR-indirectDeviceAddress-03636
    indirectDeviceAddressindirectDeviceAddress + sizeof(VkTraceRaysIndirectCommand2KHR) - 1 之间的所有设备地址必须位于同一缓冲区的缓冲区设备地址范围内

  • VUID-vkCmdTraceRaysIndirect2KHR-rayTracingPipelineTraceRaysIndirect2-03637
    必须启用 rayTracingPipelineTraceRaysIndirect2 功能

  • VUID-vkCmdTraceRaysIndirect2KHR-rayTracingMotionBlurPipelineTraceRaysIndirect-04951
    如果绑定的光线追踪管线是使用 VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV 创建的,则必须启用 VkPhysicalDeviceRayTracingMotionBlurFeaturesNV::rayTracingMotionBlurPipelineTraceRaysIndirect 功能。

有效使用(隐式)
  • VUID-vkCmdTraceRaysIndirect2KHR-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdTraceRaysIndirect2KHR-commandBuffer-recording
    commandBuffer 必须 处于 录制状态

  • VUID-vkCmdTraceRaysIndirect2KHR-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持计算操作

  • VUID-vkCmdTraceRaysIndirect2KHR-renderpass
    此命令必须仅在渲染通道实例之外调用

  • VUID-vkCmdTraceRaysIndirect2KHR-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

VkTraceRaysIndirectCommand2KHR 结构定义如下:

// Provided by VK_KHR_ray_tracing_maintenance1 with VK_KHR_ray_tracing_pipeline
typedef struct VkTraceRaysIndirectCommand2KHR {
    VkDeviceAddress    raygenShaderRecordAddress;
    VkDeviceSize       raygenShaderRecordSize;
    VkDeviceAddress    missShaderBindingTableAddress;
    VkDeviceSize       missShaderBindingTableSize;
    VkDeviceSize       missShaderBindingTableStride;
    VkDeviceAddress    hitShaderBindingTableAddress;
    VkDeviceSize       hitShaderBindingTableSize;
    VkDeviceSize       hitShaderBindingTableStride;
    VkDeviceAddress    callableShaderBindingTableAddress;
    VkDeviceSize       callableShaderBindingTableSize;
    VkDeviceSize       callableShaderBindingTableStride;
    uint32_t           width;
    uint32_t           height;
    uint32_t           depth;
} VkTraceRaysIndirectCommand2KHR;
  • raygenShaderRecordAddress 是此命令使用的光线生成着色器绑定表记录的 VkDeviceAddress

  • raygenShaderRecordSize 是一个 VkDeviceSize,表示位于基址 raygenShaderRecordAddress 的光线生成着色器绑定表记录的字节数。

  • missShaderBindingTableAddress 是此命令使用的未命中着色器绑定表中第一个记录的 VkDeviceAddress

  • missShaderBindingTableSize 是一个 VkDeviceSize,表示位于 missShaderBindingTableAddress 处的未命中着色器绑定表的总大小,此命令可能会访问该表。

  • missShaderBindingTableStride 是未命中着色器绑定表中记录之间的 VkDeviceSize 字节数。

  • hitShaderBindingTableAddress 是此命令使用的命中着色器绑定表中第一个记录的 VkDeviceAddress

  • hitShaderBindingTableSize 是一个 VkDeviceSize,表示位于 hitShaderBindingTableAddress 处的命中着色器绑定表的总大小,此命令可能会访问该表。

  • hitShaderBindingTableStride 是命中着色器绑定表中记录之间的 VkDeviceSize 字节数。

  • callableShaderBindingTableAddress 是此命令使用的可调用着色器绑定表中第一个记录的 VkDeviceAddress

  • callableShaderBindingTableSize 是一个 VkDeviceSize,表示位于 callableShaderBindingTableAddress 处的可是调用着色器绑定表的总大小,此命令可能会访问该表。

  • callableShaderBindingTableStride 是可调用着色器绑定表中记录之间的 VkDeviceSize 字节数。

  • width 是光线追踪查询维度的宽度。

  • height 是光线追踪查询维度的高度。

  • depth 是光线追踪查询维度的深度。

VkTraceRaysIndirectCommand2KHR 的成员具有与 vkCmdTraceRaysKHR 的同名参数相同的含义。

间接着色器绑定表缓冲区参数必须满足与 vkCmdTraceRaysIndirectKHRvkCmdTraceRaysKHR 中对应的参数相同的内存对齐和绑定要求。

有效用法
  • VUID-VkTraceRaysIndirectCommand2KHR-pRayGenShaderBindingTable-03680
    如果从中查询 raygenShaderRecordAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkTraceRaysIndirectCommand2KHR-pRayGenShaderBindingTable-03681
    从中查询 raygenShaderRecordAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-VkTraceRaysIndirectCommand2KHR-pRayGenShaderBindingTable-03682
    raygenShaderRecordAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-pMissShaderBindingTable-03683
    如果从中查询 missShaderBindingTableAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkTraceRaysIndirectCommand2KHR-pMissShaderBindingTable-03684
    从中查询 missShaderBindingTableAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-VkTraceRaysIndirectCommand2KHR-pMissShaderBindingTable-03685
    missShaderBindingTableAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-stride-03686
    missShaderBindingTableStride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-stride-04029
    missShaderBindingTableStride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-VkTraceRaysIndirectCommand2KHR-pHitShaderBindingTable-03687
    如果从中查询 hitShaderBindingTableAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkTraceRaysIndirectCommand2KHR-pHitShaderBindingTable-03688
    从中查询 hitShaderBindingTableAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-VkTraceRaysIndirectCommand2KHR-pHitShaderBindingTable-03689
    hitShaderBindingTableAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-stride-03690
    hitShaderBindingTableStride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-stride-04035
    hitShaderBindingTableStride 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-VkTraceRaysIndirectCommand2KHR-pCallableShaderBindingTable-03691
    如果从中查询 callableShaderBindingTableAddress 的缓冲区是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkTraceRaysIndirectCommand2KHR-pCallableShaderBindingTable-03692
    从中查询 callableShaderBindingTableAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR 使用标志创建

  • VUID-VkTraceRaysIndirectCommand2KHR-pCallableShaderBindingTable-03693
    callableShaderBindingTableAddress 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupBaseAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-stride-03694
    callableShaderBindingTableStride 必须VkPhysicalDeviceRayTracingPipelinePropertiesKHR::shaderGroupHandleAlignment 的倍数

  • VUID-VkTraceRaysIndirectCommand2KHR-stride-04041
    callableShaderBindingTableStride 必须 小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxShaderGroupStride

  • VUID-VkTraceRaysIndirectCommand2KHR-flags-03696
    如果绑定的光线追踪管线使用包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHRflags 创建,则 hitShaderBindingTableAddress 必须 不为零

  • VUID-VkTraceRaysIndirectCommand2KHR-flags-03697
    如果绑定的光线追踪管线使用包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHRflags 创建,则 hitShaderBindingTableAddress 必须 不为零

  • VUID-VkTraceRaysIndirectCommand2KHR-flags-03511
    如果绑定的光线追踪管线使用包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHRflags 创建,则由 missShaderBindingTableAddress 标识的着色器组句柄 必须 不为零

  • VUID-VkTraceRaysIndirectCommand2KHR-flags-03512
    如果绑定的光线追踪管线使用包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHRflags 创建,则为了执行 any-hit 着色器,通过此命令访问的由 hitShaderBindingTableAddress 标识的表中的条目 必须 不为零

  • VUID-VkTraceRaysIndirectCommand2KHR-flags-03513
    如果绑定的光线追踪管线使用包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHRflags 创建,则为了执行 closest hit 着色器,通过此命令访问的由 hitShaderBindingTableAddress 标识的表中的条目 必须 不为零

  • VUID-VkTraceRaysIndirectCommand2KHR-flags-03514
    如果绑定的光线追踪管线使用包含 VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHRflags 创建,则为了执行 intersection 着色器,通过此命令访问的由 hitShaderBindingTableAddress 标识的表中的条目 必须 不为零

  • VUID-VkTraceRaysIndirectCommand2KHR-pHitShaderBindingTable-04735
    hitShaderBindingTableAddress 标识的表中,通过此调用从 geometryTypeVK_GEOMETRY_TYPE_TRIANGLES_KHR 的几何体访问的任何非零 hit 着色器组条目 必须 使用 VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR 创建

  • VUID-VkTraceRaysIndirectCommand2KHR-pHitShaderBindingTable-04736
    hitShaderBindingTableAddress 标识的表中,通过此调用从 geometryTypeVK_GEOMETRY_TYPE_AABBS_KHR 的几何体访问的任何非零 hit 着色器组条目 必须 使用 VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR 创建

  • VUID-VkTraceRaysIndirectCommand2KHR-width-03638
    width 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[0]

  • VUID-VkTraceRaysIndirectCommand2KHR-height-03639
    height 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[1]

  • VUID-VkTraceRaysIndirectCommand2KHR-depth-03640
    depth 必须小于或等于 VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] × VkPhysicalDeviceLimits::maxComputeWorkGroupSize[2]

  • VUID-VkTraceRaysIndirectCommand2KHR-width-03641
    width × height × depth 必须小于或等于 VkPhysicalDeviceRayTracingPipelinePropertiesKHR::maxRayDispatchInvocationCount

着色器绑定表

着色器绑定表 是一种资源,它建立了光线追踪管线和为光线追踪管线构建的加速结构之间的关系。它指示了在加速结构中每个几何体上操作的着色器。此外,它还包含每个着色器访问的资源,包括纹理索引、缓冲区设备地址和常量。应用程序将着色器绑定表作为 VkBuffer 对象分配和管理。

着色器绑定表中的每个条目由 shaderGroupHandleSize 字节的数据组成,这些数据要么是通过 vkGetRayTracingShaderGroupHandlesKHR 查询来引用那些指定的着色器,要么全部为零以引用零着色器组。零着色器组的行为就像它是一个完全由 VK_SHADER_UNUSED_KHR 组成的着色器组。由步幅指定的其余数据是应用程序可见的数据,可以由着色器中的 ShaderRecordBufferKHR 块引用。

在光线追踪管线中使用的着色器绑定表被传递给 vkCmdTraceRaysNVvkCmdTraceRaysKHRvkCmdTraceRaysIndirectKHR 命令。在光线追踪管线上执行的着色器中,着色器绑定表是只读的。

使用 ShaderRecordBufferKHR 存储类标识的着色器变量用于访问提供的着色器绑定表。此类变量必须

  • 类型为 OpTypeStruct,或此类型的数组,

  • 使用 Block 修饰符标识,并且

  • 使用 偏移量和步幅赋值 中指定的 OffsetArrayStrideMatrixStride 修饰符显式布局。

ShaderRecordBufferKHR 存储类中任何 Block 修饰变量的成员的 Offset 修饰符 必须 不会导致该变量所需的空间超出范围 [0, maxStorageBufferRange)

从光线追踪管线访问着色器绑定表 必须VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR 管线阶段VK_ACCESS_SHADER_READ_BIT访问类型 同步

由于不同的着色器记录缓冲区可以与同一个着色器关联,因此如果同一个着色器的不同调用可以在着色器记录缓冲区中引用不同的数据,例如,如果同一个着色器在着色器绑定表中出现两次,并且具有不同的着色器记录缓冲区,则具有 ShaderRecordBufferKHR 存储类的着色器变量将不是动态一致的。在这种情况下,基于 ShaderRecordBufferKHR 存储类中的值索引资源时,索引应使用 NonUniform 修饰。

索引规则

为了在光线追踪调度期间执行正确的着色器并访问正确的资源,实现必须能够在执行的各个阶段定位着色器绑定表条目。这是通过定义一组索引规则来实现的,这些规则计算着色器绑定表中记录相对于内存中缓冲区基址的位置。应用程序必须以一种方式组织着色器绑定表的内存内容,使得应用索引规则将引导到正确的记录。

射线生成着色器

每次光线追踪调度只执行一个射线生成着色器。

对于 vkCmdTraceRaysKHR,射线生成着色器的位置由 pRaygenShaderBindingTable->deviceAddress 参数指定,无需索引。所有访问的数据必须小于 pRaygenShaderBindingTable->size 字节(从 deviceAddress 开始)。pRaygenShaderBindingTable->stride 未使用,必须等于 pRaygenShaderBindingTable->size

对于 vkCmdTraceRaysNV,射线生成着色器的位置由 raygenShaderBindingTableBufferraygenShaderBindingOffset 参数指定,无需索引。

命中着色器

用于计算相交、任意命中和最近命中着色器位置的基础是与顶层加速结构的每个实例一起存储的 instanceShaderBindingTableRecordOffset 值 (VkAccelerationStructureInstanceKHR)。此值确定给定实例的着色器绑定表记录的起始位置。

在以下规则中,geometryIndex 指的是实例内相交几何体的 几何体索引

sbtRecordOffsetsbtRecordStride 值作为参数传递给在着色器中调用的 traceNV() 或 traceRayEXT()。有关更多详细信息,请参阅 OpenGL Shading Language Specification 的第 8.19 节(光线追踪函数)。在 SPIR-V 中,这些对应于 管道跟踪射线 指令的 SBTOffsetSBTStride 参数。

然后将此计算的结果添加到 pHitShaderBindingTable->deviceAddress(传递给 vkCmdTraceRaysKHR 的设备地址)或 hitShaderBindingOffset(传递给 vkCmdTraceRaysNV 的基础偏移量)。

对于 vkCmdTraceRaysKHR,计算 pHitShaderBindingTable 中命中着色器绑定表记录地址的完整规则是

pHitShaderBindingTable->deviceAddress + pHitShaderBindingTable->stride × ( instanceShaderBindingTableRecordOffset + geometryIndex × sbtRecordStride + sbtRecordOffset )

所有访问的数据必须小于从基址开始的 pHitShaderBindingTable->size 字节。

对于 vkCmdTraceRaysNV,偏移量和步长来自直接参数,因此计算 hitShaderBindingTableBuffer 中命中着色器绑定表记录地址的完整规则是

hitShaderBindingOffset + hitShaderBindingStride × ( instanceShaderBindingTableRecordOffset + geometryIndex × sbtRecordStride + sbtRecordOffset )

未命中着色器

当射线查询未能找到给定场景几何体的交点时,将执行未命中着色器。在整个光线追踪调度中,可能会执行多个未命中着色器。

用于计算未命中着色器位置的基础是 pMissShaderBindingTable->deviceAddress(传递给 vkCmdTraceRaysKHR 的设备地址)或 missShaderBindingOffset(传递给 vkCmdTraceRaysNV 的基础偏移量)。

missIndex 值作为参数传递给在着色器中调用的 traceNV() 或 traceRayEXT()。有关更多详细信息,请参阅 OpenGL Shading Language Specification 的第 8.19 节(光线追踪函数)。在 SPIR-V 中,这对应于 管道跟踪射线 指令的 MissIndex 参数。

对于 vkCmdTraceRaysKHR,计算 pMissShaderBindingTable 中未命中着色器绑定表记录地址的完整规则是

pMissShaderBindingTable->deviceAddress + pMissShaderBindingTable->stride × missIndex

所有访问的数据必须小于从基址开始的 pMissShaderBindingTable->size 字节。

对于 vkCmdTraceRaysNV,偏移量和步长来自直接参数,因此计算 missShaderBindingTableBuffer 中未命中着色器绑定表记录地址的完整规则是

missShaderBindingOffset + missShaderBindingStride × missIndex

可调用着色器

当光线追踪着色器请求时,将执行可调用着色器。在整个光线追踪调度中,可能会执行多个可调用着色器。

用于计算可调用着色器位置的基础是 pCallableShaderBindingTable->deviceAddress(传递给 vkCmdTraceRaysKHR 的设备地址)或 callableShaderBindingOffset(传递给 vkCmdTraceRaysNV 的基础偏移量)。

sbtRecordIndex 值作为参数传递给在着色器中调用的 executeCallableNV() 或 executeCallableEXT()。有关更多详细信息,请参阅 OpenGL Shading Language Specification 的第 8.19 节(光线追踪函数)。在 SPIR-V 中,这对应于 OpExecuteCallableNVOpExecuteCallableKHR 指令的 SBTIndex 参数。

对于 vkCmdTraceRaysKHR,计算 pCallableShaderBindingTable 中可调用着色器绑定表记录地址的完整规则是

pCallableShaderBindingTable->deviceAddress + pCallableShaderBindingTable->stride × sbtRecordIndex

所有访问的数据必须小于从基址开始的 pCallableShaderBindingTable->size 字节。

对于 vkCmdTraceRaysNV,偏移量和步长来自直接参数,因此计算 callableShaderBindingTableBuffer 中可调用着色器绑定表记录地址的完整规则是

callableShaderBindingOffset + callableShaderBindingStride × sbtRecordIndex

光线追踪管道堆栈

光线追踪管道可能有一组大量的着色器,这些着色器可能以各种调用链组合调用以执行光线追踪。为了存储给定着色器执行的参数,实现可能会使用内存中的数据堆栈。此堆栈的尺寸必须设置为应用程序执行的任何调用链中所有着色器的堆栈大小之和。

如果未显式设置堆栈大小,则管道的堆栈大小为

rayGenStackMax + min(1, maxPipelineRayRecursionDepth) × max(closestHitStackMax, missStackMax, intersectionStackMax + anyHitStackMax) + max(0, maxPipelineRayRecursionDepth-1) × max(closestHitStackMax, missStackMax) + 2 × callableStackMax

其中 rayGenStackMaxclosestHitStackMaxmissStackMaxanyHitStackMaxintersectionStackMaxcallableStackMax 是由管道定义的任何着色器组中任何着色器的各个着色器阶段查询的最大堆栈值。

这个堆栈大小可能非常大,因此应用程序可能需要在管线编译后提供更准确的堆栈大小。应用程序提供的值是所有可能调用链中,所有着色器在调用链中的总和的最大值,其中考虑了任何关于调用链属性的应用程序特定知识。

例如,如果一个应用程序有两种类型的最近命中和未命中着色器可以使用,但第一级的射线只会使用第一种(可能是反射),而第二级只会使用第二种(例如,遮挡或阴影射线),那么应用程序可以通过类似于以下方式计算堆栈大小:

rayGenStack + max(closestHit1Stack, miss1Stack) + max(closestHit2Stack, miss2Stack)

这保证不大于默认堆栈大小计算,默认堆栈大小计算假设两个调用级别都可能是两者中较大的那个。

光线追踪捕获回放

bufferDeviceAddressCaptureReplay类似,rayTracingPipelineShaderGroupHandleCaptureReplay 功能允许查询可在未来回放中使用的不透明数据。

在捕获阶段,捕获/回放工具应使用 vkGetRayTracingCaptureReplayShaderGroupHandlesKHR 查询着色器组句柄回放的不透明数据。

在回放期间,在管线创建时使用 VkRayTracingShaderGroupCreateInfoKHR::pShaderGroupCaptureReplayHandle 提供不透明数据,会使实现生成与捕获阶段相同的着色器组句柄,允许捕获/回放工具重用先前记录的着色器绑定表缓冲区内容,或通过再次调用 vkGetRayTracingCaptureReplayShaderGroupHandlesKHR 获取相同的句柄。

光线追踪验证

光线追踪验证可以帮助找出应用程序问题的根本原因并提高性能。与现有的验证层不同,光线追踪验证在实现级别执行检查,这有助于识别层可能无法捕获的潜在问题。

通过启用 光线追踪验证功能,警告和错误可以直接从光线追踪实现通过注册到实现的 信使回调 传递给应用程序,这些警告和错误可以通过现有的应用程序端调试或日志记录系统进行处理。