微型映射

微型映射

加速结构存储和组织用于光线追踪的几何体,但在某些情况下,在几何体中包含一些信息是有益的,特别是对于三角形而言。微型映射围绕一个与细分的微型三角形相对应的值映射组织这些数据,这些微型三角形可以在构建底层加速结构时添加到三角形几何体中。

不透明度微型映射是一种微型映射,它存储信息以控制交叉不透明度,如 射线不透明度微型映射 中所述。

位移微型映射是一种微型映射,它存储信息以位移子三角形顶点,如 位移微型映射 中所述。

如果已执行以给定加速结构为目标的微型映射构建命令复制命令,则认为微型映射已构建。

构建微型映射

要构建微型映射,请调用

// Provided by VK_EXT_opacity_micromap
void vkCmdBuildMicromapsEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    infoCount,
    const VkMicromapBuildInfoEXT*               pInfos);
  • commandBuffer 是命令缓冲区,命令将被记录到该缓冲区中。

  • infoCount 是要构建的微型映射的数量。它指定了必须提供的 pInfos 结构的数目。

  • pInfos 是指向 infoCountVkMicromapBuildInfoEXT 结构的数组的指针,这些结构定义了用于构建每个微型映射的数据。

vkCmdBuildMicromapsEXT 命令提供了启动多个微型映射构建的能力,但是任何单个微型映射构建之间都没有隐含的排序或同步。

这意味着任何构建使用的任何微型映射内存或暂存内存之间不能存在任何内存别名。

VkMicromapBuildInfoEXT::scratchData 缓冲区设备地址标识的微型映射暂存缓冲区的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段 和(VK_ACCESS_2_MICROMAP_READ_BIT_EXT | VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT)的访问类型 同步。对 VkMicromapBuildInfoEXT::dstMicromap 的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT访问类型 同步

对任何使用的 VkMicromapBuildInfoEXT::dataVkMicromapBuildInfoEXT::triangleArray 值标识的其他输入缓冲区的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段VK_ACCESS_SHADER_READ_BIT访问类型 同步

有效用法
  • VUID-vkCmdBuildMicromapsEXT-pInfos-07461
    对于每个 pInfos[i],dstMicromap 必须已创建,且 VkMicromapCreateInfoEXT::size 的值大于或等于构建操作所需的内存大小,如 vkGetMicromapBuildSizesEXT 返回的,且 pBuildInfo = pInfos[i]

  • VUID-vkCmdBuildMicromapsEXT-mode-07462
    pInfos 的每个元素的 mode 成员必须是一个有效的 VkBuildMicromapModeEXT

  • VUID-vkCmdBuildMicromapsEXT-dstMicromap-07463
    pInfos 的任何元素的 dstMicromap 成员必须是一个有效的 VkMicromapEXT 句柄

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07464
    对于 pInfos 的每个元素,其 type 成员必须与创建其 dstMicromapVkMicromapCreateInfoEXT::type 的值匹配

  • VUID-vkCmdBuildMicromapsEXT-dstMicromap-07465
    此命令访问的 pInfos 中任何元素的 dstMicromap 成员所支持的内存范围必须不与此命令访问的 pInfos 中任何其他元素的 dstMicromap 成员所支持的内存范围重叠

  • VUID-vkCmdBuildMicromapsEXT-dstMicromap-07466
    此命令访问的 pInfos 中任何元素的 dstMicromap 成员所支持的内存范围必须不与此命令访问的任何 pInfos 元素的 scratchData 成员(包括同一元素)所支持的内存范围重叠

  • VUID-vkCmdBuildMicromapsEXT-scratchData-07467
    此命令访问的任何 pInfos 元素的 scratchData 成员所支持的内存范围必须不与此命令访问的任何其他 pInfos 元素的 scratchData 成员所支持的内存范围重叠

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07508
    对于 pInfos 的每个元素,用于创建其 dstMicromap 成员的 buffer 必须绑定到设备内存

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07509
    如果 pInfos[i].modeVK_BUILD_MICROMAP_MODE_BUILD_EXT,则 pInfos[i].scratchData.deviceAddresspInfos[i].scratchData.deviceAddress + N - 1 之间的所有地址必须位于同一缓冲区的缓冲区设备地址范围内,其中 N 由 VkMicromapBuildSizesInfoEXT 结构的 buildScratchSize 成员给出,该结构是从调用 vkGetMicromapBuildSizesEXT 返回的,其中具有相同的 VkMicromapBuildInfoEXT 结构和图元计数

  • VUID-vkCmdBuildMicromapsEXT-data-07510
    从中查询所有 pInfos[i] 的所有 datatriangleArray 成员的缓冲区设备地址的缓冲区必须已使用 VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT 使用标志创建

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07511
    对于 pInfos[i] 的每个元素,从中查询缓冲区设备地址 pInfos[i].scratchData.deviceAddress 的缓冲区必须已使用 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT 使用标志创建

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07512
    对于 pInfos 的每个元素,其 scratchData.deviceAddressdata.deviceAddresstriangleArray.deviceAddress 成员必须是从 vkGetBufferDeviceAddress 获取的有效设备地址

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07513
    对于 pInfos 的每个元素,如果 scratchData.deviceAddressdata.deviceAddresstriangleArray.deviceAddress 是非稀疏缓冲区的地址,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07514
    对于 pInfos 的每个元素,其 scratchData.deviceAddress 成员必须VkPhysicalDeviceAccelerationStructurePropertiesKHR::minAccelerationStructureScratchOffsetAlignment 的倍数

  • VUID-vkCmdBuildMicromapsEXT-pInfos-07515
    对于 pInfos 的每个元素,其 triangleArray.deviceAddressdata.deviceAddress 成员必须256 的倍数

有效用法(隐式)
  • VUID-vkCmdBuildMicromapsEXT-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdBuildMicromapsEXT-pInfos-parameter
    pInfos 必须是指向 infoCount 个有效 VkMicromapBuildInfoEXT 结构数组的有效指针

  • VUID-vkCmdBuildMicromapsEXT-commandBuffer-recording
    commandBuffer 必须处于记录状态

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

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

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

  • VUID-vkCmdBuildMicromapsEXT-infoCount-arraylength
    infoCount 必须大于 0

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

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

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

微映射构建中可以在 VkMicromapUsageEXT::formatVkMicromapTriangleEXT::format 中设置的格式是

// Provided by VK_EXT_opacity_micromap
typedef enum VkOpacityMicromapFormatEXT {
    VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT = 1,
    VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT = 2,
} VkOpacityMicromapFormatEXT;
  • VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT 指定给定的微映射格式每个子三角形有一个位,编码完全不透明或完全透明。

  • VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT 指定给定的微映射格式每个子三角形有两个位,编码四种模式,可以如光线遍历中所述解释。

为了紧凑性,这些值在某些结构中存储为 16 位。

微映射构建中可以在 VkMicromapUsageEXT::formatVkMicromapTriangleEXT::format 中设置的格式是

// Provided by VK_NV_displacement_micromap
typedef enum VkDisplacementMicromapFormatNV {
    VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NV = 1,
    VK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NV = 2,
    VK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV = 3,
} VkDisplacementMicromapFormatNV;
  • VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NV 指定给定的微映射格式在 64 字节中编码 64 个微三角形的位移,如位移微映射编码中所述。

  • VK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NV 指定给定的微映射格式在 128 字节中编码 256 个微三角形的位移,如位移微映射编码中所述。

  • VK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV 指定给定的微映射格式在 128 字节中编码 1024 个微三角形的位移,如位移微映射编码中所述。

为了紧凑性,这些值在某些结构中存储为 16 位。

VkMicromapBuildInfoEXT 结构定义为

// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapBuildInfoEXT {
    VkStructureType                     sType;
    const void*                         pNext;
    VkMicromapTypeEXT                   type;
    VkBuildMicromapFlagsEXT             flags;
    VkBuildMicromapModeEXT              mode;
    VkMicromapEXT                       dstMicromap;
    uint32_t                            usageCountsCount;
    const VkMicromapUsageEXT*           pUsageCounts;
    const VkMicromapUsageEXT* const*    ppUsageCounts;
    VkDeviceOrHostAddressConstKHR       data;
    VkDeviceOrHostAddressKHR            scratchData;
    VkDeviceOrHostAddressConstKHR       triangleArray;
    VkDeviceSize                        triangleArrayStride;
} VkMicromapBuildInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • type 是一个 VkMicromapTypeEXT 值,指定正在构建的微映射的类型。

  • flags 是一个 VkBuildMicromapFlagBitsEXT 的位掩码,指定微映射的附加参数。

  • mode 是一个 VkBuildMicromapModeEXT 值,指定要执行的操作类型。

  • dstMicromap 是指向用于构建的目标微型映射的指针。

  • usageCountsCount 指定将用于确定此微型映射大小的使用计数结构的数目。

  • pUsageCounts 是指向 VkMicromapUsageEXT 结构数组的指针。

  • ppUsageCounts 是指向 VkMicromapUsageEXT 结构指针数组的指针。

  • data 是指向包含微型映射数据的内存的设备或主机地址。

  • scratchData 是指向将用作构建的临时内存的设备或主机地址。

  • triangleArray 是指向包含 VkMicromapTriangleEXT 数据的内存的设备或主机地址。

  • triangleArrayStridetriangleArray 的每个元素之间的字节步幅。

pUsageCountsppUsageCounts 中只能有一个是指向有效指针,另一个**必须**为 NULL。非 NULL 数组的元素描述了用于构建每个微型映射的总计数。每个元素包含一个 count,它是该微型映射中包含的具有该 formatsubdivisionLevel 的微型映射三角形的数量。允许具有相同 formatsubdivisionLevel 的多个元素,并且该 formatsubdivisionLevel 的总计数是每个元素的 count 之和。

每个微型映射三角形都引用 triangleArray 中的一个元素,该元素包含该特定三角形的 formatsubdivisionLevel,以及一个以字节为单位的 dataOffset,它是相对于 data 该三角形的微型映射数据开始的位置。triangleArray 的数据布局为:一个 4 字节无符号整数表示 dataOffset,后跟一个 2 字节无符号整数表示细分级别,然后再后跟一个 2 字节无符号整数表示格式。实际上,编译器编译 VkMicromapTriangleEXT 以匹配此模式。

对于不透明度微型映射,data 处的数据按每个元素一位进行打包(对于 VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT)或按每个元素两位进行打包(对于 VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT),并且在每个字节中从 LSB 到 MSB 进行打包。这些字节中每个索引处的数据的解释在 光线不透明度微型映射 中讨论。

对于位移微型映射,data 处的数据的解释在 位移微型映射编码 中讨论。

有效用法
  • VUID-VkMicromapBuildInfoEXT-pUsageCounts-07516
    pUsageCountsppUsageCounts 中只能有一个是指向有效指针,另一个**必须**为 NULL

  • VUID-VkMicromapBuildInfoEXT-type-07517
    如果 typeVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT,则 VkMicromapUsageEXTformat 成员**必须**是 VkOpacityMicromapFormatEXT 中的有效值。

  • VUID-VkMicromapBuildInfoEXT-type-07518
    如果 typeVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT,则 VkMicromapTriangleEXTformat 成员**必须**是 VkOpacityMicromapFormatEXT 中的有效值。

  • VUID-VkMicromapBuildInfoEXT-type-08704
    如果 typeVK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV,则 VkMicromapUsageEXTformat 成员**必须**是 VkDisplacementMicromapFormatNV 中的有效值。

  • VUID-VkMicromapBuildInfoEXT-type-08705
    如果 typeVK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV,则 VkMicromapTriangleEXTformat 成员**必须**是 VkDisplacementMicromapFormatNV 中的有效值。

有效用法(隐式)
  • VUID-VkMicromapBuildInfoEXT-sType-sType
    sType **必须**为 VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT

  • VUID-VkMicromapBuildInfoEXT-pNext-pNext
    pNext **必须**为 NULL

  • VUID-VkMicromapBuildInfoEXT-type-parameter
    type **必须**是有效的 VkMicromapTypeEXT

  • VUID-VkMicromapBuildInfoEXT-flags-parameter
    flags **必须**是 VkBuildMicromapFlagBitsEXT 值的有效组合。

  • VUID-VkMicromapBuildInfoEXT-pUsageCounts-parameter
    如果 usageCountsCount 不为 0,且 pUsageCounts 不为 NULL,则 pUsageCounts **必须**是指向 usageCountsCountVkMicromapUsageEXT 结构数组的有效指针。

  • VUID-VkMicromapBuildInfoEXT-ppUsageCounts-parameter
    如果 usageCountsCount 不为 0,且 ppUsageCounts 不为 NULL,则 ppUsageCounts **必须**是指向 usageCountsCountVkMicromapUsageEXT 结构有效指针的数组的有效指针。

VkBuildMicromapModeEXT 枚举定义为:

// Provided by VK_EXT_opacity_micromap
typedef enum VkBuildMicromapModeEXT {
    VK_BUILD_MICROMAP_MODE_BUILD_EXT = 0,
} VkBuildMicromapModeEXT;
  • VK_BUILD_MICROMAP_MODE_BUILD_EXT 指定将使用指定的数据构建目标微型映射。

VkMicromapUsageEXT 结构定义为:

// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapUsageEXT {
    uint32_t    count;
    uint32_t    subdivisionLevel;
    uint32_t    format;
} VkMicromapUsageEXT;
  • count 是微型映射中由下面的 subdivisionLevelformat 定义的使用格式中的三角形数量。

  • subdivisionLevel 是此使用格式的细分级别。

  • format 是此使用格式的格式。

有效用法
  • VUID-VkMicromapUsageEXT-format-07519
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT,则 format **必须**为 VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXTVK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT

  • VUID-VkMicromapUsageEXT-format-07520
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXTformatVK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT,则 subdivisionLevel **必须**小于或等于 VkPhysicalDeviceOpacityMicromapPropertiesEXT::maxOpacity2StateSubdivisionLevel

  • VUID-VkMicromapUsageEXT-format-07521
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXTformatVK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT,则 subdivisionLevel **必须**小于或等于 VkPhysicalDeviceOpacityMicromapPropertiesEXT::maxOpacity4StateSubdivisionLevel

  • VUID-VkMicromapUsageEXT-format-08706
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV,则 format 必须VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NVVK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NVVK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV

  • VUID-VkMicromapUsageEXT-subdivisionLevel-08707
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV,则 subdivisionLevel 必须 小于或等于 VkPhysicalDeviceDisplacementMicromapPropertiesNV::maxDisplacementMicromapSubdivisionLevel

format 的解释基于使用它的微型映射的 type

VkMicromapTriangleEXT 结构定义如下:

// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapTriangleEXT {
    uint32_t    dataOffset;
    uint16_t    subdivisionLevel;
    uint16_t    format;
} VkMicromapTriangleEXT;
  • dataOffset 是此三角形的数据起始位置的字节偏移量。这是一个字节对齐的值。

  • subdivisionLevel 是此三角形的细分级别。

  • format 是此三角形的格式。

有效用法
  • VUID-VkMicromapTriangleEXT-format-07522
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT,则 format **必须**为 VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXTVK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT

  • VUID-VkMicromapTriangleEXT-format-07523
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXTformatVK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT,则 subdivisionLevel **必须**小于或等于 VkPhysicalDeviceOpacityMicromapPropertiesEXT::maxOpacity2StateSubdivisionLevel

  • VUID-VkMicromapTriangleEXT-format-07524
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_OPACITY_MICROMAP_EXTformatVK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT,则 subdivisionLevel **必须**小于或等于 VkPhysicalDeviceOpacityMicromapPropertiesEXT::maxOpacity4StateSubdivisionLevel

  • VUID-VkMicromapTriangleEXT-format-08708
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV,则 format 必须VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NVVK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NVVK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV

  • VUID-VkMicromapTriangleEXT-subdivisionLevel-08709
    如果微型映射的 VkMicromapTypeEXTVK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV,则 subdivisionLevel 必须 小于或等于 VkPhysicalDeviceDisplacementMicromapPropertiesNV::maxDisplacementMicromapSubdivisionLevel

format 的解释基于使用它的微型映射的 type

复制微型映射

存在一个额外的命令用于复制微型映射,而不更新其内容。在复制之前,应用程序必须查询生成的微型映射的大小。

要查询微型映射大小参数,请调用

// Provided by VK_EXT_opacity_micromap
void vkCmdWriteMicromapsPropertiesEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    micromapCount,
    const VkMicromapEXT*                        pMicromaps,
    VkQueryType                                 queryType,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery);
  • commandBuffer 是命令缓冲区,命令将被记录到该缓冲区中。

  • micromapCount 是要查询属性的微型映射的数量。

  • pMicromaps 是指向现有先前构建的微型映射数组的指针。

  • queryType 是一个 VkQueryType 值,指定池管理的查询类型。

  • queryPool 是将管理查询结果的查询池。

  • firstQuery 是查询池中包含 micromapCount 个结果的第一个查询索引。

pMicromaps 中列出的任何微型映射的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段VK_ACCESS_2_MICROMAP_READ_BIT_EXT访问类型 同步

  • 如果 queryTypeVK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT,则写出的值是序列化微型映射所需的字节数。

  • 如果 queryTypeVK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT,则写出的值是压缩微型映射所需的字节数。

有效用法
  • VUID-vkCmdWriteMicromapsPropertiesEXT-queryPool-07525
    queryPool 必须已使用与 queryType 匹配的 queryType 创建。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-queryPool-07526
    queryPoolfirstQuery 标识的查询必须不可用的。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-buffer-07527
    用于创建 pMicrmaps 中每个微型映射的 buffer 必须绑定到设备内存。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-query-07528
    querymicromapCount 的总和必须小于或等于 queryPool 中的查询数。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-pMicromaps-07501
    pMicromaps 中的所有微型映射必须在此命令执行之前构建。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-pMicromaps-07502
    如果 queryTypeVK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT,则 pMicromaps 中的所有微型映射必须使用 VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT 构建。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-queryType-07503
    queryType 必须VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXTVK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT

有效用法(隐式)
  • VUID-vkCmdWriteMicromapsPropertiesEXT-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdWriteMicromapsPropertiesEXT-pMicromaps-parameter
    pMicromaps 必须是指向 micromapCount 个有效 VkMicromapEXT 句柄的数组的有效指针。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-queryType-parameter
    queryType 必须是有效的 VkQueryType 值。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-queryPool-parameter
    queryPool 必须是有效的 VkQueryPool 句柄。

  • VUID-vkCmdWriteMicromapsPropertiesEXT-commandBuffer-recording
    commandBuffer 必须处于记录状态

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

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

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

  • VUID-vkCmdWriteMicromapsPropertiesEXT-micromapCount-arraylength
    micromapCount 必须大于 0

  • VUID-vkCmdWriteMicromapsPropertiesEXT-commonparent
    commandBufferqueryPoolpMicromaps 的元素中的每一个必须已从同一个 VkDevice 创建、分配或检索。

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

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

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

要复制微型映射,请调用

// Provided by VK_EXT_opacity_micromap
void vkCmdCopyMicromapEXT(
    VkCommandBuffer                             commandBuffer,
    const VkCopyMicromapInfoEXT*                pInfo);
  • commandBuffer 是命令缓冲区,命令将被记录到该缓冲区中。

  • pInfo 是指向 VkCopyMicromapInfoEXT 结构的指针,该结构定义复制操作。

此命令以 pInfo->mode 指定的方式将 pInfo->src 微型映射复制到 pInfo->dst 微型映射。

pInfo->srcpInfo->dst 的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段VK_ACCESS_2_MICROMAP_READ_BIT_EXTVK_ACCESS_2_MICROMAP_WRITE_BIT_EXT访问类型 同步(根据情况)。

有效用法
  • VUID-vkCmdCopyMicromapEXT-buffer-07529
    用于创建 pInfo->srcbuffer 必须绑定到设备内存

  • VUID-vkCmdCopyMicromapEXT-buffer-07530
    用于创建 pInfo->dstbuffer 必须绑定到设备内存

有效用法(隐式)
  • VUID-vkCmdCopyMicromapEXT-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdCopyMicromapEXT-pInfo-parameter
    pInfo 必须是指向有效的 VkCopyMicromapInfoEXT 结构的有效指针

  • VUID-vkCmdCopyMicromapEXT-commandBuffer-recording
    commandBuffer 必须处于记录状态

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

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

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

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

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

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

VkCopyMicromapInfoEXT 结构定义如下

// Provided by VK_EXT_opacity_micromap
typedef struct VkCopyMicromapInfoEXT {
    VkStructureType          sType;
    const void*              pNext;
    VkMicromapEXT            src;
    VkMicromapEXT            dst;
    VkCopyMicromapModeEXT    mode;
} VkCopyMicromapInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • src 是复制操作的源微型映射。

  • dst 是复制操作的目标微型映射。

  • mode 是一个 VkCopyMicromapModeEXT 值,指定在复制期间执行的其他操作。

有效用法
  • VUID-VkCopyMicromapInfoEXT-mode-07531
    mode 必须VK_COPY_MICROMAP_MODE_COMPACT_EXTVK_COPY_MICROMAP_MODE_CLONE_EXT

  • VUID-VkCopyMicromapInfoEXT-src-07532
    源加速结构 src 必须在此命令执行之前构建

  • VUID-VkCopyMicromapInfoEXT-mode-07533
    如果 modeVK_COPY_MICROMAP_MODE_COMPACT_EXT,则 src 必须在构建时使用 VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT 构建

  • VUID-VkCopyMicromapInfoEXT-buffer-07534
    用于创建 srcbuffer 必须绑定到设备内存

  • VUID-VkCopyMicromapInfoEXT-buffer-07535
    用于创建 dstbuffer 必须绑定到设备内存

有效用法(隐式)
  • VUID-VkCopyMicromapInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_MICROMAP_INFO_EXT

  • VUID-VkCopyMicromapInfoEXT-pNext-pNext
    pNext **必须**为 NULL

  • VUID-VkCopyMicromapInfoEXT-src-parameter
    src 必须是有效的 VkMicromapEXT 句柄

  • VUID-VkCopyMicromapInfoEXT-dst-parameter
    dst 必须是有效的 VkMicromapEXT 句柄

  • VUID-VkCopyMicromapInfoEXT-mode-parameter
    mode 必须是有效的 VkCopyMicromapModeEXT

  • VUID-VkCopyMicromapInfoEXT-commonparent
    dstsrc 必须已从相同的 VkDevice 创建、分配或检索

mode 的可能值指定在复制期间执行的其他操作,有

// Provided by VK_EXT_opacity_micromap
typedef enum VkCopyMicromapModeEXT {
    VK_COPY_MICROMAP_MODE_CLONE_EXT = 0,
    VK_COPY_MICROMAP_MODE_SERIALIZE_EXT = 1,
    VK_COPY_MICROMAP_MODE_DESERIALIZE_EXT = 2,
    VK_COPY_MICROMAP_MODE_COMPACT_EXT = 3,
} VkCopyMicromapModeEXT;
  • VK_COPY_MICROMAP_MODE_CLONE_EXT 创建 src 中指定的微型映射的直接副本到 dst 指定的微型映射中。dst 微型映射必须使用与 src 相同的参数创建。

  • VK_COPY_MICROMAP_MODE_SERIALIZE_EXT 将微型映射序列化为半不透明格式,该格式可以在兼容的实现上重新加载。

  • VK_COPY_MICROMAP_MODE_DESERIALIZE_EXT 将缓冲区中的半不透明序列化格式反序列化为微型映射。

  • VK_COPY_MICROMAP_MODE_COMPACT_EXT 创建微型映射 src 的更紧凑版本到 dst 中。微型映射 dst 必须创建时的大小至少与 vkCmdWriteMicromapsPropertiesEXT 在构建 src 指定的微型映射后返回的大小一样大。

要将微型映射复制到设备内存,请调用

// Provided by VK_EXT_opacity_micromap
void vkCmdCopyMicromapToMemoryEXT(
    VkCommandBuffer                             commandBuffer,
    const VkCopyMicromapToMemoryInfoEXT*        pInfo);
  • commandBuffer 是命令缓冲区,命令将被记录到该缓冲区中。

  • pInfo 是指向 VkCopyMicromapToMemoryInfoEXT 结构的指针,该结构定义了复制操作。

pInfo->src 的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段VK_ACCESS_2_MICROMAP_READ_BIT_EXT访问类型同步。对 pInfo->dst.deviceAddress 指示的缓冲区的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段和 VK_ACCESS_TRANSFER_WRITE_BIT 的访问类型同步。

此命令产生与 vkCopyMicromapToMemoryEXT 相同的结果,但将其结果写入设备地址,并在设备而不是主机上执行。输出可能不一定是逐位相同的,但它可以同样被 vkCmdCopyMemoryToMicromapEXTvkCopyMemoryToMicromapEXT 使用。

序列化数据的已定义头结构包括

  • VK_UUID_SIZE 字节的数据,与 VkPhysicalDeviceIDProperties::driverUUID 匹配

  • VK_UUID_SIZE 字节的数据,用于使用 vkGetDeviceMicromapCompatibilityEXT 识别比较的兼容性。序列化数据根据主机字节序写入缓冲区(或从缓冲区读取)。

有效用法
  • VUID-vkCmdCopyMicromapToMemoryEXT-pInfo-07536
    pInfo->dst.deviceAddress 必须是绑定到设备内存的缓冲区的有效设备地址

  • VUID-vkCmdCopyMicromapToMemoryEXT-pInfo-07537
    pInfo->dst.deviceAddress 必须256 字节对齐

  • VUID-vkCmdCopyMicromapToMemoryEXT-pInfo-07538
    如果 pInfo->dst.deviceAddress 指向的缓冲区是非稀疏的,那么它必须完全且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-vkCmdCopyMicromapToMemoryEXT-buffer-07539
    用于创建 pInfo->srcbuffer 必须绑定到设备内存

有效用法(隐式)
  • VUID-vkCmdCopyMicromapToMemoryEXT-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdCopyMicromapToMemoryEXT-pInfo-parameter
    pInfo 必须是指向有效的 VkCopyMicromapToMemoryInfoEXT 结构的有效指针

  • VUID-vkCmdCopyMicromapToMemoryEXT-commandBuffer-recording
    commandBuffer 必须处于记录状态

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

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

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

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

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

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

// Provided by VK_EXT_opacity_micromap
typedef struct VkCopyMicromapToMemoryInfoEXT {
    VkStructureType             sType;
    const void*                 pNext;
    VkMicromapEXT               src;
    VkDeviceOrHostAddressKHR    dst;
    VkCopyMicromapModeEXT       mode;
} VkCopyMicromapToMemoryInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • src 是复制操作的源微型映射

  • dst 是设备或主机内存地址,它是复制操作的目标

  • mode 是一个 VkCopyMicromapModeEXT 值,指定在复制期间执行的其他操作。

有效用法
  • VUID-VkCopyMicromapToMemoryInfoEXT-src-07540
    源微型映射 src 必须在此命令执行之前构建

  • VUID-VkCopyMicromapToMemoryInfoEXT-dst-07541
    dst 指向的内存必须至少和 src 的序列化大小一样大,该大小由 vkWriteMicromapsPropertiesEXTvkCmdWriteMicromapsPropertiesEXT 报告,查询类型为 VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT

  • VUID-VkCopyMicromapToMemoryInfoEXT-mode-07542
    mode 必须VK_COPY_MICROMAP_MODE_SERIALIZE_EXT

有效用法(隐式)
  • VUID-VkCopyMicromapToMemoryInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_MICROMAP_TO_MEMORY_INFO_EXT

  • VUID-VkCopyMicromapToMemoryInfoEXT-pNext-pNext
    pNext **必须**为 NULL

  • VUID-VkCopyMicromapToMemoryInfoEXT-src-parameter
    src 必须是有效的 VkMicromapEXT 句柄

  • VUID-VkCopyMicromapToMemoryInfoEXT-mode-parameter
    mode 必须是有效的 VkCopyMicromapModeEXT

要将设备内存复制到微型地图,请调用

// Provided by VK_EXT_opacity_micromap
void vkCmdCopyMemoryToMicromapEXT(
    VkCommandBuffer                             commandBuffer,
    const VkCopyMemoryToMicromapInfoEXT*        pInfo);
  • commandBuffer 是命令缓冲区,命令将被记录到该缓冲区中。

  • pInfo 是指向 VkCopyMemoryToMicromapInfoEXT 结构的指针,该结构定义了复制操作。

pInfo->dst 的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段VK_ACCESS_2_MICROMAP_READ_BIT_EXT访问类型同步。对 pInfo->src.deviceAddress 指示的缓冲区的访问必须VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段和 VK_ACCESS_TRANSFER_READ_BIT 的访问类型同步。

此命令可以接受由 vkCmdCopyMicromapToMemoryEXTvkCopyMicromapToMemoryEXT 生成的微型地图。

有效用法
  • VUID-vkCmdCopyMemoryToMicromapEXT-pInfo-07543
    pInfo->src.deviceAddress 必须是绑定到设备内存的缓冲区的有效设备地址。

  • VUID-vkCmdCopyMemoryToMicromapEXT-pInfo-07544
    pInfo->src.deviceAddress 必须对齐到 256 字节。

  • VUID-vkCmdCopyMemoryToMicromapEXT-pInfo-07545
    如果 pInfo->src.deviceAddress 指向的缓冲区是非稀疏的,那么它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-vkCmdCopyMemoryToMicromapEXT-buffer-07546
    用于创建 pInfo->dstbuffer 必须绑定到设备内存

有效用法(隐式)
  • VUID-vkCmdCopyMemoryToMicromapEXT-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄

  • VUID-vkCmdCopyMemoryToMicromapEXT-pInfo-parameter
    pInfo 必须是指向有效的 VkCopyMemoryToMicromapInfoEXT 结构的有效指针。

  • VUID-vkCmdCopyMemoryToMicromapEXT-commandBuffer-recording
    commandBuffer 必须处于记录状态

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

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

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

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

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

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
次要

外部

外部

计算

操作

VkCopyMemoryToMicromapInfoEXT 结构的定义如下:

// Provided by VK_EXT_opacity_micromap
typedef struct VkCopyMemoryToMicromapInfoEXT {
    VkStructureType                  sType;
    const void*                      pNext;
    VkDeviceOrHostAddressConstKHR    src;
    VkMicromapEXT                    dst;
    VkCopyMicromapModeEXT            mode;
} VkCopyMemoryToMicromapInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • src 是设备或主机地址,其中包含复制操作的源数据。

  • dst 是复制操作的目标微型映射。

  • mode 是一个 VkCopyMicromapModeEXT 值,指定在复制期间执行的其他操作。

有效用法
  • VUID-VkCopyMemoryToMicromapInfoEXT-src-07547
    src 指向的源内存必须包含先前使用 vkCmdCopyMicromapToMemoryEXT 序列化的数据。

  • VUID-VkCopyMemoryToMicromapInfoEXT-mode-07548
    mode 必须VK_COPY_MICROMAP_MODE_DESERIALIZE_EXT

  • VUID-VkCopyMemoryToMicromapInfoEXT-src-07549
    src 中的数据必须具有与 vkGetDeviceMicromapCompatibilityEXT 返回的目标物理设备兼容的格式。

  • VUID-VkCopyMemoryToMicromapInfoEXT-dst-07550
    创建 dst 时,其 size 必须大于或等于用于序列化 src 中数据的大小。

有效用法(隐式)
  • VUID-VkCopyMemoryToMicromapInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_COPY_MEMORY_TO_MICROMAP_INFO_EXT

  • VUID-VkCopyMemoryToMicromapInfoEXT-pNext-pNext
    pNext **必须**为 NULL

  • VUID-VkCopyMemoryToMicromapInfoEXT-dst-parameter
    dst 必须是有效的 VkMicromapEXT 句柄

  • VUID-VkCopyMemoryToMicromapInfoEXT-mode-parameter
    mode 必须是有效的 VkCopyMicromapModeEXT

要检查序列化的微型地图是否与当前设备兼容,请调用

// Provided by VK_EXT_opacity_micromap
void vkGetDeviceMicromapCompatibilityEXT(
    VkDevice                                    device,
    const VkMicromapVersionInfoEXT*             pVersionInfo,
    VkAccelerationStructureCompatibilityKHR*    pCompatibility);
有效用法
  • VUID-vkGetDeviceMicromapCompatibilityEXT-micromap-07551
    micromap 功能必须启用。

有效用法(隐式)
  • VUID-vkGetDeviceMicromapCompatibilityEXT-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkGetDeviceMicromapCompatibilityEXT-pVersionInfo-parameter
    pVersionInfo 必须是指向有效的 VkMicromapVersionInfoEXT 结构的有效指针。

  • VUID-vkGetDeviceMicromapCompatibilityEXT-pCompatibility-parameter
    pCompatibility 必须是指向 VkAccelerationStructureCompatibilityKHR 值的有效指针。

VkMicromapVersionInfoEXT 结构的定义如下:

// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapVersionInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    const uint8_t*     pVersionData;
} VkMicromapVersionInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pVersionData 是指向微型地图版本头的指针,如 vkCmdCopyMicromapToMemoryEXT 中定义。

pVersionData 是一个指向 2×VK_UUID_SIZEuint8_t 值的数组的指针,而不是两个 VK_UUID_SIZE 数组,因为此成员的预期用例是指向先前序列化的微型映射的头部(通过 vkCmdCopyMicromapToMemoryEXTvkCopyMicromapToMemoryEXT),该头部已加载到内存中。使用数组将需要额外复制 UUID 的内存。

有效用法(隐式)
  • VUID-VkMicromapVersionInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MICROMAP_VERSION_INFO_EXT

  • VUID-VkMicromapVersionInfoEXT-pNext-pNext
    pNext **必须**为 NULL

  • VUID-VkMicromapVersionInfoEXT-pVersionData-parameter
    pVersionData 必须是指向 uint8_t 值的数组的有效指针

主机微型映射操作

如果启用了 micromapHostCommands 功能,则还要求实现提供微型映射操作的主机实现。

这些命令在功能上与其设备对应命令相同,只是它们在主机时间线上执行,而不是排队到命令缓冲区中。

主机命令使用的所有微映射必须绑定到主机可见内存,并且微映射构建的所有输入数据必须使用主机地址而不是设备地址进行引用。使用主机命令时,应用程序不需要映射微映射内存。

vkBuildMicromapsEXTvkCmdBuildMicromapsEXT 可能使用不同的算法,因此不需要产生相同的结构。

除了这些细节之外,主机和设备操作是可互换的。

为了高效执行,使用这些命令操作的微映射应始终绑定到主机缓存内存,因为在命令执行期间,实现可能需要重复读取和写入此内存。

要在主机上构建微映射,请调用

// Provided by VK_EXT_opacity_micromap
VkResult vkBuildMicromapsEXT(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    uint32_t                                    infoCount,
    const VkMicromapBuildInfoEXT*               pInfos);
  • device 是正在构建微映射的 VkDevice

  • deferredOperation 是一个可选的 VkDeferredOperationKHR,用于 请求延迟 此命令。

  • infoCount 是要构建的微映射的数量。它指定了必须提供的 pInfos 的数量。

  • pInfos 是指向 infoCountVkMicromapBuildInfoEXT 结构的数组的指针,这些结构定义了用于构建每个微映射的几何图形。

此命令执行与 vkCmdBuildMicromapsEXT 相同的任务,但由主机执行。

vkBuildMicromapsEXT 命令提供了启动多个微映射构建的能力,但是,任何单个微映射构建之间都没有暗示任何排序或同步。

这意味着任何构建使用的任何微型映射内存或暂存内存之间不能存在任何内存别名。

有效用法
  • VUID-vkBuildMicromapsEXT-pInfos-07461
    对于每个 pInfos[i],dstMicromap 必须已创建,且 VkMicromapCreateInfoEXT::size 的值大于或等于构建操作所需的内存大小,如 vkGetMicromapBuildSizesEXT 返回的,且 pBuildInfo = pInfos[i]

  • VUID-vkBuildMicromapsEXT-mode-07462
    pInfos 的每个元素的 mode 成员必须是一个有效的 VkBuildMicromapModeEXT

  • VUID-vkBuildMicromapsEXT-dstMicromap-07463
    pInfos 的任何元素的 dstMicromap 成员必须是一个有效的 VkMicromapEXT 句柄

  • VUID-vkBuildMicromapsEXT-pInfos-07464
    对于 pInfos 的每个元素,其 type 成员必须与创建其 dstMicromapVkMicromapCreateInfoEXT::type 的值匹配

  • VUID-vkBuildMicromapsEXT-dstMicromap-07465
    此命令访问的 pInfos 中任何元素的 dstMicromap 成员所支持的内存范围必须不与此命令访问的 pInfos 中任何其他元素的 dstMicromap 成员所支持的内存范围重叠

  • VUID-vkBuildMicromapsEXT-dstMicromap-07466
    此命令访问的 pInfos 中任何元素的 dstMicromap 成员所支持的内存范围必须不与此命令访问的任何 pInfos 元素的 scratchData 成员(包括同一元素)所支持的内存范围重叠

  • VUID-vkBuildMicromapsEXT-scratchData-07467
    此命令访问的任何 pInfos 元素的 scratchData 成员所支持的内存范围必须不与此命令访问的任何其他 pInfos 元素的 scratchData 成员所支持的内存范围重叠

  • VUID-vkBuildMicromapsEXT-pInfos-07552
    对于 pInfos 的每个元素,用于创建其 dstMicromap 成员的 buffer 必须绑定到主机可见的设备内存

  • VUID-vkBuildMicromapsEXT-pInfos-07553
    对于 pInfos 的每个元素,pInfos[i].data.hostAddress 的所有引用地址必须是有效的主机内存

  • VUID-vkBuildMicromapsEXT-pInfos-07554
    对于 pInfos 的每个元素,pInfos[i].triangleArray.hostAddress 的所有引用地址必须是有效的主机内存

  • VUID-vkBuildMicromapsEXT-micromapHostCommands-07555
    必须启用 VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands 功能

  • VUID-vkBuildMicromapsEXT-pInfos-07556
    如果 pInfos[i].modeVK_BUILD_MICROMAP_MODE_BUILD_EXT,则 pInfos[i].scratchData.hostAddresspInfos[i].scratchData.hostAddress + N - 1 之间的所有地址必须是有效的主机内存,其中 N 由调用 vkGetMicromapBuildSizesEXT 返回的 VkMicromapBuildSizesInfoEXT 结构的 buildScratchSize 成员给出,该调用具有相同的 VkMicromapBuildInfoEXT 结构和原始计数

  • VUID-vkBuildMicromapsEXT-pInfos-07557
    对于 pInfos 的每个元素,用于创建其 dstMicromap 成员的 buffer 必须绑定到未使用多个实例分配的内存

有效用法(隐式)
  • VUID-vkBuildMicromapsEXT-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkBuildMicromapsEXT-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation 必须是有效的 VkDeferredOperationKHR 句柄

  • VUID-vkBuildMicromapsEXT-pInfos-parameter
    pInfos 必须是指向 infoCount 个有效 VkMicromapBuildInfoEXT 结构数组的有效指针

  • VUID-vkBuildMicromapsEXT-infoCount-arraylength
    infoCount 必须大于 0

  • VUID-vkBuildMicromapsEXT-deferredOperation-parent
    如果 deferredOperation 是有效的句柄,则必须已从 device 创建、分配或检索它

返回代码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要在主机上复制或压缩微映射,请调用

// Provided by VK_EXT_opacity_micromap
VkResult vkCopyMicromapEXT(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    const VkCopyMicromapInfoEXT*                pInfo);

此命令执行与 vkCmdCopyMicromapEXT 相同的任务,但由主机执行。

有效用法
  • VUID-vkCopyMicromapEXT-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkCopyMicromapEXT-buffer-07558
    用于创建 pInfo->srcbuffer 必须绑定到主机可见的设备内存

  • VUID-vkCopyMicromapEXT-buffer-07559
    用于创建 pInfo->dstbuffer 必须绑定到主机可见的设备内存

  • VUID-vkCopyMicromapEXT-micromapHostCommands-07560
    必须启用 VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands 功能

  • VUID-vkCopyMicromapEXT-buffer-07561
    用于创建 pInfo->srcbuffer 必须绑定到未使用多个实例分配的内存

  • VUID-vkCopyMicromapEXT-buffer-07562
    用于创建 pInfo->dstbuffer 必须绑定到未使用多个实例分配的内存

有效用法(隐式)
  • VUID-vkCopyMicromapEXT-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkCopyMicromapEXT-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation 必须是有效的 VkDeferredOperationKHR 句柄

  • VUID-vkCopyMicromapEXT-pInfo-parameter
    pInfo 必须是指向有效的 VkCopyMicromapInfoEXT 结构的有效指针

  • VUID-vkCopyMicromapEXT-deferredOperation-parent
    如果 deferredOperation 是有效的句柄,则必须已从 device 创建、分配或检索它

返回代码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要将主机可访问内存复制到微映射,请调用

// Provided by VK_EXT_opacity_micromap
VkResult vkCopyMemoryToMicromapEXT(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    const VkCopyMemoryToMicromapInfoEXT*        pInfo);

此命令执行与 vkCmdCopyMemoryToMicromapEXT 相同的任务,但由主机执行。

此命令可以接受由 vkCmdCopyMicromapToMemoryEXTvkCopyMicromapToMemoryEXT 生成的微型地图。

有效用法
  • VUID-vkCopyMemoryToMicromapEXT-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkCopyMemoryToMicromapEXT-pInfo-07563
    pInfo->src.hostAddress 必须 是一个有效的主机指针

  • VUID-vkCopyMemoryToMicromapEXT-pInfo-07564
    pInfo->src.hostAddress 必须 对齐到 16 字节

  • VUID-vkCopyMemoryToMicromapEXT-buffer-07565
    用于创建 pInfo->dstbuffer 必须绑定到主机可见的设备内存

  • VUID-vkCopyMemoryToMicromapEXT-micromapHostCommands-07566
    必须启用 VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands 功能

  • VUID-vkCopyMemoryToMicromapEXT-buffer-07567
    用于创建 pInfo->dstbuffer 必须绑定到未使用多个实例分配的内存

有效用法(隐式)
  • VUID-vkCopyMemoryToMicromapEXT-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkCopyMemoryToMicromapEXT-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation 必须是有效的 VkDeferredOperationKHR 句柄

  • VUID-vkCopyMemoryToMicromapEXT-pInfo-parameter
    pInfo 必须是指向有效的 VkCopyMemoryToMicromapInfoEXT 结构的有效指针。

  • VUID-vkCopyMemoryToMicromapEXT-deferredOperation-parent
    如果 deferredOperation 是有效的句柄,则必须已从 device 创建、分配或检索它

返回代码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要将微型映射复制到主机可访问的内存,请调用

// Provided by VK_EXT_opacity_micromap
VkResult vkCopyMicromapToMemoryEXT(
    VkDevice                                    device,
    VkDeferredOperationKHR                      deferredOperation,
    const VkCopyMicromapToMemoryInfoEXT*        pInfo);

此命令与 vkCmdCopyMicromapToMemoryEXT 执行相同的任务,但由主机执行。

此命令产生与 vkCmdCopyMicromapToMemoryEXT 相同的结果,但将其结果直接写入主机指针,并在主机而不是设备上执行。输出可能不一定按位完全相同,但它可以被 vkCmdCopyMemoryToMicromapEXTvkCopyMemoryToMicromapEXT 同等使用。

有效用法
  • VUID-vkCopyMicromapToMemoryEXT-deferredOperation-03678
    deferredOperation 关联的任何先前的延迟操作必须已完成

  • VUID-vkCopyMicromapToMemoryEXT-buffer-07568
    用于创建 pInfo->srcbuffer 必须绑定到主机可见的设备内存

  • VUID-vkCopyMicromapToMemoryEXT-pInfo-07569
    pInfo->dst.hostAddress 必须 是一个有效的主机指针

  • VUID-vkCopyMicromapToMemoryEXT-pInfo-07570
    pInfo->dst.hostAddress 必须 对齐到 16 字节

  • VUID-vkCopyMicromapToMemoryEXT-micromapHostCommands-07571
    必须启用 VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands 功能

  • VUID-vkCopyMicromapToMemoryEXT-buffer-07572
    用于创建 pInfo->srcbuffer 必须绑定到未使用多个实例分配的内存

有效用法(隐式)
  • VUID-vkCopyMicromapToMemoryEXT-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkCopyMicromapToMemoryEXT-deferredOperation-parameter
    如果 deferredOperation 不是 VK_NULL_HANDLE,则 deferredOperation 必须是有效的 VkDeferredOperationKHR 句柄

  • VUID-vkCopyMicromapToMemoryEXT-pInfo-parameter
    pInfo 必须是指向有效的 VkCopyMicromapToMemoryInfoEXT 结构的有效指针

  • VUID-vkCopyMicromapToMemoryEXT-deferredOperation-parent
    如果 deferredOperation 是有效的句柄,则必须已从 device 创建、分配或检索它

返回代码
成功
  • VK_SUCCESS

  • VK_OPERATION_DEFERRED_KHR

  • VK_OPERATION_NOT_DEFERRED_KHR

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要在主机上查询微型映射大小参数,请调用

// Provided by VK_EXT_opacity_micromap
VkResult vkWriteMicromapsPropertiesEXT(
    VkDevice                                    device,
    uint32_t                                    micromapCount,
    const VkMicromapEXT*                        pMicromaps,
    VkQueryType                                 queryType,
    size_t                                      dataSize,
    void*                                       pData,
    size_t                                      stride);
  • device 是拥有 pMicromaps 中微型映射的设备。

  • micromapCount 是要查询属性的微型映射的数量。

  • pMicromaps 是指向现有先前构建的微型映射数组的指针。

  • queryType 是一个 VkQueryType 值,指定要查询的属性。

  • dataSizepData 指向的缓冲区的大小(以字节为单位)。

  • pData 是指向应用程序分配的缓冲区的指针,结果将写入该缓冲区。

  • stridepData 中各个查询结果之间的步幅(以字节为单位)。

此命令与 vkCmdWriteMicromapsPropertiesEXT 执行相同的任务,但由主机执行。

有效用法
  • VUID-vkWriteMicromapsPropertiesEXT-pMicromaps-07501
    pMicromaps 中的所有微型映射必须在此命令执行之前构建。

  • VUID-vkWriteMicromapsPropertiesEXT-pMicromaps-07502
    如果 queryTypeVK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT,则 pMicromaps 中的所有微型映射必须使用 VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT 构建。

  • VUID-vkWriteMicromapsPropertiesEXT-queryType-07503
    queryType 必须VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXTVK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT

  • VUID-vkWriteMicromapsPropertiesEXT-queryType-10071
    如果 queryTypeVK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXTVK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT,则 stride 必须VkDeviceSize 大小的倍数

  • VUID-vkWriteMicromapsPropertiesEXT-queryType-10072
    如果 queryTypeVK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXTVK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT,则 pData 必须 指向一个 VkDeviceSize

  • VUID-vkWriteMicromapsPropertiesEXT-dataSize-07576
    dataSize 必须 大于或等于 micromapCount*stride

  • VUID-vkWriteMicromapsPropertiesEXT-buffer-07577
    用于创建 pMicromaps 中每个微型映射的 buffer 必须 绑定到主机可见的设备内存

  • VUID-vkWriteMicromapsPropertiesEXT-micromapHostCommands-07578
    必须启用 VkPhysicalDeviceOpacityMicromapFeaturesEXT::micromapHostCommands 功能

  • VUID-vkWriteMicromapsPropertiesEXT-buffer-07579
    用于创建 pMicromaps 中每个微型映射的 buffer 必须 绑定到未使用多个实例分配的内存

有效用法(隐式)
  • VUID-vkWriteMicromapsPropertiesEXT-device-parameter
    device 必须是有效的 VkDevice 句柄。

  • VUID-vkWriteMicromapsPropertiesEXT-pMicromaps-parameter
    pMicromaps 必须是指向 micromapCount 个有效 VkMicromapEXT 句柄的数组的有效指针。

  • VUID-vkWriteMicromapsPropertiesEXT-queryType-parameter
    queryType 必须是有效的 VkQueryType 值。

  • VUID-vkWriteMicromapsPropertiesEXT-pData-parameter
    pData 必须 是指向 dataSize 字节数组的有效指针

  • VUID-vkWriteMicromapsPropertiesEXT-micromapCount-arraylength
    micromapCount 必须大于 0

  • VUID-vkWriteMicromapsPropertiesEXT-dataSize-arraylength
    dataSize 必须 大于 0

  • VUID-vkWriteMicromapsPropertiesEXT-pMicromaps-parent
    pMicromaps 的每个元素必须已从 device 创建、分配或检索。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

位移微映射

加速结构中的位移微映射包含 VkAccelerationStructureTrianglesDisplacementMicromapNV 中的信息,用于定义基本三角形和位移方向,然后使用微映射中编码的位移信息来应用于这些值,以生成最终位置。

位移基本三角形

如果提供了 displacementBiasAndScaleBuffer,则从该缓冲区获取偏差和缩放值。如果 displacementBiasAndScaleBuffer 为零,则假设偏差和缩放值分别为 0.0 和 1.0。

给定来自几何体的输入位置,位移使用的基本位置和位移向量通过以下方式计算:

basePosition = inputPosition + displacementVector × bias

baseDisplacementVector = displacementVector × scale

每个微顶点的参数由从底层加速结构中提取的基本三角形参数、该微顶点的重心以及从对应于该微顶点的位移微映射中获取的位移值的组合得出。

microVertexBasePosition = lerp(basePositions, microVertexBarycentrics)

microVertexDisplacementVector = lerp(displacementVectors, microVertexBarycentrics)

microVertexDisplacedPosition = microVertexBasePosition + microVertexDisplacementVector × micromapDisplacementValue

位移微映射编码

位移量存储在位移块中,每个位移块覆盖一个微顶点的三角形区域。根据细分级别和编码格式,一个或多个位移块组合在一起,以存储给定位移微映射的所有位移值。

如果需要多个块,则位移块在位移微映射内沿空间填充曲线组织,然后微顶点在位移微映射内沿相同的空间填充曲线组织。

空间填充曲线是纯粹的分层结构,具有递归分割,类似于不透明度微映射,但作用于顶点而不是三角形。为了保持分层顺序的连续性,同时保持连续的绕组,一些三角形会翻转并以不同的方式绕组。

VK_DISPLACEMENT_MICROMAP_FORMAT_64_TRIANGLES_64_BYTES_NV 格式是一种未压缩的打包格式,在一个块中覆盖 64 个微三角形(细分级别 3)。该块包含 45 个位移值,编码为 11 位无符号归一化值,并以如上所述的顶点顺序紧密打包存储,占用 495 位。之后是 15 个未使用的位,然后是 2 个保留位,必须为 0。如果此块用于存储低于 3 的细分级别的位移,则忽略后面的未使用值。

字段 条目 每个条目的位数 起始位偏移

位移量

顶点 0 - 44

45

11

0

未使用

1

15

495

保留

必须为 0

1

2

510

VK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NVVK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV 格式以压缩形式存储位移,以节省空间。两种格式使用相同的压缩算法,不同之处在于在不同字段中使用的位数。

压缩算法的工作原理是,首先使用完全指定的锚点顶点,然后对于每个级别,预测位移值并对该值的校正进行编码,对于每个细分级别使用较少的位数。

当在递归细分过程中在两个相邻的位移值之间添加顶点时,预测值由两个相邻值的整数的四舍五入平均值给出:

prediction = (A + B + 1) / 2

应用校正后的解码值由下式给出:

decoded = prediction + ( SignExtend(correction) << shift )

其中 correction 由给定级别和微顶点的校正字段给出,shift 由从级别索引的 shifts 字段给出,然后由 4 个值给出,这些值按顺序从内部或 3 个边中选择。

VK_DISPLACEMENT_MICROMAP_FORMAT_256_TRIANGLES_128_BYTES_NV 的位编码

字段 条目 每个条目的位数 起始位偏移

锚点

顶点 0 - 2

3

11

0

校正

级别 1

3

11

33

级别 2

9

11

66

级别 3

30

10

165

级别 4

108

5

465

未使用

1

1

1005

位移

级别 4

4

3

1006

级别 3

4

1

1018

保留

必须为 0

1

2

1022

VK_DISPLACEMENT_MICROMAP_FORMAT_1024_TRIANGLES_128_BYTES_NV 的位编码

字段 条目 每个条目的位数 起始位偏移

锚点

顶点 0 - 2

3

11

0

校正

级别 1

3

11

33

级别 2

9

8

66

级别 3

30

4

138

级别 4

108

2

258

级别 5

408

1

474

未使用

1

88

882

位移

级别 5

4

4

970

级别 4

4

4

986

级别 3

4

3

1002

级别 2

4

2

1014

保留

必须为 0

1

2

1022