加速结构
加速结构
加速结构是实现用来有效地管理场景几何体的数据结构,在光线追踪查询期间遍历时会用到。应用程序负责管理加速结构对象(参见加速结构),包括分配、销毁、执行构建或更新以及同步光线追踪查询期间使用的资源。
有两种类型的加速结构,顶层加速结构和底层加速结构。
加速结构更新规则
API 定义了两种从几何体生成加速结构的操作
-
构建操作用于构造加速结构。
-
更新操作用于修改现有的加速结构。
更新操作对输入施加一定的约束,以换取更快的执行速度。执行更新时,应用程序需要提供加速结构的完整描述,但禁止更改实例定义、变换矩阵和顶点或 AABB 位置之外的任何内容。描述的所有其他方面必须与原始构建中的完全匹配。
更准确地说,应用程序必须不使用更新操作来执行以下任何操作
-
将基元或实例从活动更改为非活动,反之亦然(如非活动基元和实例中所定义)。
-
更改三角形几何体的索引或顶点格式。
-
将三角形几何体变换指针从 null 更改为非 null,反之亦然。
-
更改结构中几何体或实例的数量。
-
更改结构中任何几何体的几何体标志。
-
更改结构中任何几何体的顶点或基元的数量。
如果原始加速结构是使用不透明微型映射构建的,并且在 flags
中设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT
,则应用程序必须向更新操作提供相应的微型映射信息。应用程序禁止更改分配给三角形的特定不透明度值之外的任何内容。
更准确地说,应用程序必须不使用更新操作来执行以下任何操作
-
从先前拥有微型映射或 VkOpacityMicromapSpecialIndexEXT 值的几何体中删除微型映射或值,反之亦然。
-
在使用 VkOpacityMicromapSpecialIndexEXT 值和显式微型映射三角形之间进行更改。
-
更改与任何加速结构三角形关联的微型映射三角形的细分级别或格式。
如果原始加速结构是使用不透明微型映射构建的,并且在 flags
中设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT
,则应用程序必须向更新操作提供微型映射。
如果原始加速结构是使用不透明微型映射构建的,并且未设置不透明微型映射更新标志,则应用程序必须向更新操作提供原始微型映射。
如果原始加速结构是使用位移微型映射构建的,并且在 flags
中设置了 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV
,则应用程序必须向更新操作提供位移微型映射。
如果原始加速结构是使用位移微型映射构建的,并且未设置位移微型映射更新标志,则应用程序必须向更新操作提供原始微型映射。
非活动基元和实例
加速结构允许使用特定的输入值来表示非活动的基元或实例。
如果任何顶点的第一个 (X) 分量是 NaN,则三角形是非活动的。如果任何其他顶点分量是 NaN,而第一个分量不是,则行为是未定义的。如果顶点格式没有 NaN 表示形式,则所有三角形都被视为活动状态。
如果实例的加速结构引用为 0
,则该实例是非活动的。
一个非激活的 AABB 是指其最小 X 坐标为 NaN 的 AABB。如果任何其他分量为 NaN,而第一个不是,则行为是未定义的。
在以上定义中,“NaN” 指的是任何类型的 NaN。包括 signaling、non-signaling、quiet、loud 或其他类型的 NaN。
一个非激活的对象被认为对所有射线都是不可见的,并且不应该在加速结构中表示。实现应该确保非激活对象的存在不会严重降低遍历性能。
非激活对象会在自动生成的索引序列中被计数,这些索引序列通过 InstanceId
和 PrimitiveId
SPIR-V 修饰符提供给着色器。这允许场景中的对象在激活和非激活状态之间自由更改,而不会影响任何使用 ID 值索引的数组的布局。
任何在激活和非激活状态之间的转换都需要重建完整的加速结构。应用程序必须不能执行加速结构更新,其中对象在源加速结构中是激活的,但在目标加速结构中将是非激活的,反之亦然。
退化图元和实例
退化图元和实例的行为与非激活图元和实例不同,定义如下:
-
三角形,其一个或多个顶点的各自 (X)、(Y)、(Z) 分量相同,或者三个顶点中至少有两个 (X)、(Y) 或 (Z) 分量相同,因此形成一条线或一个点。退化三角形不会生成任何相交。
-
AABB,其
minX
=maxX
、minY
=maxY
和minZ
=maxZ
。退化 AABB 可能会调用相交着色器。 -
实例,引用不包含任何激活图元的底层加速结构。构建加速结构时,实现应该将退化实例视为位于实例原点的一个点,由 VkAccelerationStructureInstanceKHR::
transform
指定。
与非激活图元和实例不同,退化图元和实例在执行加速结构更新时可能会从退化状态转换为非退化状态,反之亦然。
如果构建加速结构时,在 VkAccelerationStructureInfoNV::flags
或 VkAccelerationStructureBuildGeometryInfoKHR::flags
中未设置 VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR
,则退化图元可能会被丢弃。对于多个顶点定义了相同索引值的图元可以始终被丢弃。
构建加速结构
要构建加速结构,请调用:
// Provided by VK_NV_ray_tracing
void vkCmdBuildAccelerationStructureNV(
VkCommandBuffer commandBuffer,
const VkAccelerationStructureInfoNV* pInfo,
VkBuffer instanceData,
VkDeviceSize instanceOffset,
VkBool32 update,
VkAccelerationStructureNV dst,
VkAccelerationStructureNV src,
VkBuffer scratch,
VkDeviceSize scratchOffset);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pInfo
包含加速结构共享的结构信息。 -
instanceData
是包含 VkAccelerationStructureInstanceKHR 结构数组的缓冲区,用于定义加速结构。对于底层加速结构,此参数必须为NULL
。 -
instanceOffset
是实例数据所在位置的字节偏移量(相对于instanceData
的起始位置)。 -
update
指定是否使用src
中的数据更新dst
加速结构。 -
dst
是指向构建的目标加速结构的指针。 -
src
是指向现有加速结构的指针,该加速结构将用于更新dst
加速结构。 -
scratch
是将用作构建的暂存内存的 VkBuffer。 -
scratchOffset
是相对于scratch
起始位置的字节偏移量,将用作暂存内存。
要构建加速结构,请调用
// Provided by VK_KHR_acceleration_structure
void vkCmdBuildAccelerationStructuresKHR(
VkCommandBuffer commandBuffer,
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
-
commandBuffer
是将记录命令的命令缓冲区。 -
infoCount
是要构建的加速结构的数目。它指定必须提供的pInfos
结构和ppBuildRangeInfos
指针的数量。 -
pInfos
是指向infoCount
个 VkAccelerationStructureBuildGeometryInfoKHR 结构数组的指针,这些结构定义了用于构建每个加速结构的几何图形。 -
ppBuildRangeInfos
是指向infoCount
个指针数组的指针,这些指针数组指向 VkAccelerationStructureBuildRangeInfoKHR 结构。每个ppBuildRangeInfos
[i] 是指向pInfos
[i].geometryCount
个 VkAccelerationStructureBuildRangeInfoKHR 结构数组的指针,这些结构定义了指向存储几何数据的地址的动态偏移,如pInfos
[i] 所定义。
vkCmdBuildAccelerationStructuresKHR
命令提供了启动多个加速结构构建的功能,但是,任何单独的加速结构构建之间没有隐含的排序或同步。
这意味着应用程序 **不能** 在与正在构建的关联的底层或实例加速结构的同一个 vkCmdBuildAccelerationStructuresKHR 调用中构建顶层加速结构。在任何构建使用的任何加速结构内存或暂存内存之间也 **不能** 存在任何内存别名。 |
对由 VkAccelerationStructureBuildGeometryInfoKHR::scratchData
缓冲区设备地址标识的加速结构暂存缓冲区的访问必须与 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段以及 (VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR
| VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR
) 的访问类型同步。对每个 VkAccelerationStructureBuildGeometryInfoKHR::srcAccelerationStructure
和 VkAccelerationStructureBuildGeometryInfoKHR::dstAccelerationStructure
的访问必须与 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段以及相应的 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR
或 VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR
访问类型同步。
对由 VkAccelerationStructureGeometryMotionTrianglesDataNV::vertexData
, VkAccelerationStructureGeometryTrianglesDataKHR::vertexData
, VkAccelerationStructureGeometryTrianglesDataKHR::indexData
, VkAccelerationStructureGeometryTrianglesDataKHR::transformData
, VkAccelerationStructureGeometryAabbsDataKHR::data
和 VkAccelerationStructureGeometryInstancesDataKHR::data
的任何已使用值标识的其他输入缓冲区的访问必须与 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段以及 VK_ACCESS_SHADER_READ_BIT
的访问类型同步。
要构建一些参数来源于设备的加速结构,请调用
// Provided by VK_KHR_acceleration_structure
void vkCmdBuildAccelerationStructuresIndirectKHR(
VkCommandBuffer commandBuffer,
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
const VkDeviceAddress* pIndirectDeviceAddresses,
const uint32_t* pIndirectStrides,
const uint32_t* const* ppMaxPrimitiveCounts);
-
commandBuffer
是将记录命令的命令缓冲区。 -
infoCount
是要构建的加速结构的数目。 -
pInfos
是指向infoCount
个 VkAccelerationStructureBuildGeometryInfoKHR 结构数组的指针,这些结构定义了用于构建每个加速结构的几何图形。 -
pIndirectDeviceAddresses
是指向一个infoCount
个缓冲设备地址的数组的指针,这些地址指向由pInfos
[i] 定义的、包含动态偏移的pInfos
[i].geometryCount
个 VkAccelerationStructureBuildRangeInfoKHR 结构,这些动态偏移指向存储几何体数据的地址。 -
pIndirectStrides
是指向一个包含infoCount
个字节步幅的数组的指针,这些步幅表示pIndirectDeviceAddresses
数组中元素之间的距离。 -
ppMaxPrimitiveCounts
是指向一个包含infoCount
个指针的数组的指针,这些指针指向包含pInfos
[i].geometryCount
个值的数组,这些值指示此命令将为每个几何体构建的最大图元数量。
对加速结构、暂存缓冲区、顶点缓冲区、索引缓冲区和实例缓冲区的访问**必须**与 vkCmdBuildAccelerationStructuresKHR 同步。
VkAccelerationStructureBuildGeometryInfoKHR
结构定义为
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureBuildGeometryInfoKHR {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureTypeKHR type;
VkBuildAccelerationStructureFlagsKHR flags;
VkBuildAccelerationStructureModeKHR mode;
VkAccelerationStructureKHR srcAccelerationStructure;
VkAccelerationStructureKHR dstAccelerationStructure;
uint32_t geometryCount;
const VkAccelerationStructureGeometryKHR* pGeometries;
const VkAccelerationStructureGeometryKHR* const* ppGeometries;
VkDeviceOrHostAddressKHR scratchData;
} VkAccelerationStructureBuildGeometryInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
type
是一个 VkAccelerationStructureTypeKHR 值,用于指定正在构建的加速结构的类型。 -
flags
是 VkBuildAccelerationStructureFlagBitsKHR 的位掩码,用于指定加速结构的附加参数。 -
mode
是一个 VkBuildAccelerationStructureModeKHR 值,用于指定要执行的操作类型。 -
srcAccelerationStructure
是指向现有加速结构的指针,该结构在mode
为VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR
时用于更新dstAccelerationStructure
加速结构。 -
dstAccelerationStructure
是指向构建的目标加速结构的指针。 -
geometryCount
指定将构建到dstAccelerationStructure
中的几何体数量。 -
pGeometries
是指向 VkAccelerationStructureGeometryKHR 结构的数组的指针。 -
ppGeometries
是指向 VkAccelerationStructureGeometryKHR 结构的指针数组的指针。 -
scratchData
是指向将用作构建的临时内存的设备或主机地址。
pGeometries
或 ppGeometries
中只能有一个是指向有效数据的指针,另一个必须为 NULL
。非 NULL
数组的每个元素都描述了用于构建每个加速结构几何体的数据。
在光线遍历期间,使用 VkAccelerationStructureBuildGeometryInfoKHR 的 pGeometries
或 ppGeometries
成员的每个元素的索引作为 *几何体索引*。几何体索引在光线着色器中通过 RayGeometryIndexKHR
内置变量 可用,并且用于确定遍历期间执行的命中和相交着色器。几何体索引通过 OpRayQueryGetIntersectionGeometryIndexKHR
指令可用于光线查询。
在 flags
中设置 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV
表示此构建是运动顶层加速结构。如果 VkAccelerationStructureGeometryInstancesDataKHR::arrayOfPointers
为 VK_FALSE
,则运动顶层使用 VkAccelerationStructureMotionInstanceNV 格式的实例。
如果 VkAccelerationStructureGeometryInstancesDataKHR::arrayOfPointers
为 VK_TRUE
,则实例指针数组中每个元素的指针由 4 位的 VkAccelerationStructureMotionInstanceTypeNV
组成,这 4 位位于指针的低 4 位,用于标识指针所指向的结构类型。访问的设备地址是数组中的值,且低 4 位设置为零。指针所指向的结构是 VkAccelerationStructureInstanceKHR、VkAccelerationStructureMatrixMotionInstanceNV 或 VkAccelerationStructureSRTMotionInstanceNV 之一,具体取决于低 4 位中编码的类型值。
在其实例中包含运动实例或顶点运动的顶层加速结构必须在 flags
中设置 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV
。
对于更新操作(当 mode
为 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR
时),成员 srcAccelerationStructure
和 dstAccelerationStructure
可以相同或不同。如果它们相同,则更新操作将就地执行。否则,将更新目标加速结构,而源结构不会被修改。
VkBuildAccelerationStructureModeKHR
枚举定义如下:
// Provided by VK_KHR_acceleration_structure
typedef enum VkBuildAccelerationStructureModeKHR {
VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR = 0,
VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR = 1,
} VkBuildAccelerationStructureModeKHR;
-
VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR
指定将使用指定的几何体构建目标加速结构。 -
VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR
指定将使用源加速结构中的数据构建目标加速结构,并使用指定的几何体进行更新。
VkDeviceOrHostAddressKHR
联合体定义如下:
// Provided by VK_KHR_acceleration_structure
typedef union VkDeviceOrHostAddressKHR {
VkDeviceAddress deviceAddress;
void* hostAddress;
} VkDeviceOrHostAddressKHR;
-
deviceAddress
是由 vkGetBufferDeviceAddressKHR 命令返回的缓冲区设备地址。 -
hostAddress
是主机内存地址。
VkDeviceOrHostAddressConstKHR
联合体定义如下:
// Provided by VK_KHR_acceleration_structure
typedef union VkDeviceOrHostAddressConstKHR {
VkDeviceAddress deviceAddress;
const void* hostAddress;
} VkDeviceOrHostAddressConstKHR;
-
deviceAddress
是由 vkGetBufferDeviceAddressKHR 命令返回的缓冲区设备地址。 -
hostAddress
是一个 const 主机内存地址。
VkAccelerationStructureGeometryKHR
结构体定义如下:
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryKHR {
VkStructureType sType;
const void* pNext;
VkGeometryTypeKHR geometryType;
VkAccelerationStructureGeometryDataKHR geometry;
VkGeometryFlagsKHR flags;
} VkAccelerationStructureGeometryKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
geometryType
描述此VkAccelerationStructureGeometryKHR
引用的几何体类型。 -
geometry
是一个 VkAccelerationStructureGeometryDataKHR 联合体,描述相关几何体类型的几何体数据。 -
flags
是一个 VkGeometryFlagBitsKHR 值的位掩码,描述如何构建几何体的其他属性。
VkAccelerationStructureGeometryDataKHR
联合体定义如下:
// Provided by VK_KHR_acceleration_structure
typedef union VkAccelerationStructureGeometryDataKHR {
VkAccelerationStructureGeometryTrianglesDataKHR triangles;
VkAccelerationStructureGeometryAabbsDataKHR aabbs;
VkAccelerationStructureGeometryInstancesDataKHR instances;
} VkAccelerationStructureGeometryDataKHR;
-
triangles
是一个 VkAccelerationStructureGeometryTrianglesDataKHR 结构。 -
aabbs
是一个 VkAccelerationStructureGeometryAabbsDataKHR 结构。 -
instances
是一个 VkAccelerationStructureGeometryInstancesDataKHR 结构。
VkAccelerationStructureGeometryTrianglesDataKHR
结构体定义如下:
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryTrianglesDataKHR {
VkStructureType sType;
const void* pNext;
VkFormat vertexFormat;
VkDeviceOrHostAddressConstKHR vertexData;
VkDeviceSize vertexStride;
uint32_t maxVertex;
VkIndexType indexType;
VkDeviceOrHostAddressConstKHR indexData;
VkDeviceOrHostAddressConstKHR transformData;
} VkAccelerationStructureGeometryTrianglesDataKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
vertexFormat
是每个顶点元素的 VkFormat。 -
vertexData
是指向包含此几何体的顶点数据的内存的设备或主机地址。 -
maxVertex
是vertexData
中顶点数减一。 -
vertexStride
是每个顶点之间的字节步长。 -
indexType
是每个索引元素的 VkIndexType。 -
indexData
是指向包含此几何体的索引数据的内存的设备或主机地址。 -
transformData
是指向内存的设备或主机地址,该内存包含指向 VkTransformMatrixKHR 结构的可选引用,该结构描述了从描述此几何体中顶点的空间到定义加速结构的空间的转换。
与图形管道中 VkVertexInputBindingDescription 的顶点缓冲区步长(不能超过 |
VkAccelerationStructureGeometryMotionTrianglesDataNV
结构定义如下:
// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureGeometryMotionTrianglesDataNV {
VkStructureType sType;
const void* pNext;
VkDeviceOrHostAddressConstKHR vertexData;
} VkAccelerationStructureGeometryMotionTrianglesDataNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
vertexData
是指向此几何体在时间 1.0 的顶点数据的指针。
如果 VkAccelerationStructureGeometryMotionTrianglesDataNV
包含在 VkAccelerationStructureGeometryTrianglesDataKHR 结构的 pNext
链中,则基本顶点位置用于几何体在时间 0.0 的三角形位置,VkAccelerationStructureGeometryMotionTrianglesDataNV
中的 vertexData
用于时间 1.0 的顶点位置,中间时间的位置进行线性插值。
VkAccelerationStructureGeometryMotionTrianglesDataNV
的 vertexData
的索引与基本顶点位置数据等效。
VkAccelerationStructureTrianglesOpacityMicromapEXT
结构定义如下:
// Provided by VK_EXT_opacity_micromap
typedef struct VkAccelerationStructureTrianglesOpacityMicromapEXT {
VkStructureType sType;
void* pNext;
VkIndexType indexType;
VkDeviceOrHostAddressConstKHR indexBuffer;
VkDeviceSize indexStride;
uint32_t baseTriangle;
uint32_t usageCountsCount;
const VkMicromapUsageEXT* pUsageCounts;
const VkMicromapUsageEXT* const* ppUsageCounts;
VkMicromapEXT micromap;
} VkAccelerationStructureTrianglesOpacityMicromapEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
indexType
是索引此微映射时使用的三角形索引的类型。 -
indexBuffer
是包含三角形索引的地址。 -
indexStride
是三角形索引之间的字节步幅。 -
baseTriangle
是添加到非负三角形索引的基值。 -
usageCountsCount
指定将用于确定此微映射大小的用法计数结构的数目。 -
pUsageCounts
是指向 VkMicromapUsageEXT 结构数组的指针。 -
ppUsageCounts
是指向 VkMicromapUsageEXT 结构指针数组的指针。 -
micromap
是要包含在此几何体中的微映射对象的句柄。
如果 VkAccelerationStructureTrianglesOpacityMicromapEXT
包含在 VkAccelerationStructureGeometryTrianglesDataKHR 结构的 pNext
链中,则该几何体将引用该微映射。
对于几何体中的每个三角形,加速结构构建使用 indexType
和 indexStride
从 indexBuffer
中获取索引。如果该值是 VkOpacityMicromapSpecialIndexEXT 中某个值的无符号转换,则该三角形的行为与 射线不透明度微映射中该特殊值描述的行为相同。否则,该三角形使用 micromap
中该索引加上 baseTriangle
的不透明度微映射信息。
pUsageCounts
和 ppUsageCounts
中只能有一个是指向有效指针,另一个必须为 NULL
。非 NULL
数组的元素描述用于构建此几何体的总计数。对于给定的 format
和 subdivisionLevel
,在此几何体中,与间接和特殊索引处理后匹配这些值的三角形数目必须等于提供的匹配 count
的总和。
如果 micromap
是 VK_NULL_HANDLE,则从 indexBuffer
读取的每个值必须是 VkOpacityMicromapSpecialIndexEXT
中的值之一。
VkOpacityMicromapSpecialIndexEXT
枚举定义如下:
// Provided by VK_EXT_opacity_micromap
typedef enum VkOpacityMicromapSpecialIndexEXT {
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT = -1,
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT = -2,
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT = -3,
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT = -4,
} VkOpacityMicromapSpecialIndexEXT;
-
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT
指定整个三角形完全透明。 -
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT
指定整个三角形完全不透明。 -
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT
指定整个三角形为未知透明。 -
VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT
指定整个三角形为未知不透明。
VkAccelerationStructureTrianglesDisplacementMicromapNV
结构定义如下:
// Provided by VK_NV_displacement_micromap
typedef struct VkAccelerationStructureTrianglesDisplacementMicromapNV {
VkStructureType sType;
void* pNext;
VkFormat displacementBiasAndScaleFormat;
VkFormat displacementVectorFormat;
VkDeviceOrHostAddressConstKHR displacementBiasAndScaleBuffer;
VkDeviceSize displacementBiasAndScaleStride;
VkDeviceOrHostAddressConstKHR displacementVectorBuffer;
VkDeviceSize displacementVectorStride;
VkDeviceOrHostAddressConstKHR displacedMicromapPrimitiveFlags;
VkDeviceSize displacedMicromapPrimitiveFlagsStride;
VkIndexType indexType;
VkDeviceOrHostAddressConstKHR indexBuffer;
VkDeviceSize indexStride;
uint32_t baseTriangle;
uint32_t usageCountsCount;
const VkMicromapUsageEXT* pUsageCounts;
const VkMicromapUsageEXT* const* ppUsageCounts;
VkMicromapEXT micromap;
} VkAccelerationStructureTrianglesDisplacementMicromapNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
displacementBiasAndScaleFormat
是此位移微映射参考中使用的位移偏差和缩放的格式。 -
displacementVectorFormat
是此位移微映射参考中使用的位移矢量的格式。 -
displacementBiasAndScaleBuffer
是包含偏移和缩放值的地址。 -
displacementBiasAndScaleStride
是偏移值和缩放值之间的字节步长。 -
displacementVectorBuffer
是包含位移向量值的地址。 -
displacementVectorStride
是位移向量值之间的字节步长。 -
displacedMicromapPrimitiveFlags
是包含图元标志的地址。 -
displacedMicromapPrimitiveFlagsStride
是图元标志值之间的字节步长。 -
indexType
是索引此微型贴图时使用的三角形索引的类型。 -
indexBuffer
是包含三角形索引的地址。 -
indexStride
是三角形索引之间的字节步长。 -
baseTriangle
是添加到非负三角形索引的基值。 -
usageCountsCount
指定将用于确定此微映射大小的用法计数结构的数目。 -
pUsageCounts
是指向 VkMicromapUsageEXT 结构数组的指针。 -
ppUsageCounts
是指向 VkMicromapUsageEXT 结构指针数组的指针。 -
micromap
是要包含在此几何体中的微型贴图对象的句柄。
如果 VkAccelerationStructureTrianglesDisplacementMicromapNV
包含在 VkAccelerationStructureGeometryTrianglesDataKHR 结构的 pNext
链中,则该几何体将引用该微型贴图。
对于几何体中的每个三角形,加速结构构建会使用 indexType
和 indexStride
从 indexBuffer
中获取索引。该三角形使用来自 micromap
的位移微型贴图信息,该信息位于该索引加上 baseTriangle
处。
pUsageCounts
或 ppUsageCounts
中只能有一个是指向有效指针,另一个必须为 NULL
。非 NULL
数组的元素描述了用于构建此几何体的总计数。对于给定的 format
和 subdivisionLevel
,此几何体中与间接寻址后匹配这些值的三角形数量必须等于所提供的匹配 count
的总和。
VkTransformMatrixKHR
结构定义为
// Provided by VK_KHR_acceleration_structure
typedef struct VkTransformMatrixKHR {
float matrix[3][4];
} VkTransformMatrixKHR;
或等效的
// Provided by VK_NV_ray_tracing
typedef VkTransformMatrixKHR VkTransformMatrixNV;
-
matrix
是一个 3x4 行主仿射变换矩阵。
VkAccelerationStructureGeometryAabbsDataKHR
结构定义为
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryAabbsDataKHR {
VkStructureType sType;
const void* pNext;
VkDeviceOrHostAddressConstKHR data;
VkDeviceSize stride;
} VkAccelerationStructureGeometryAabbsDataKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
data
是指向内存的设备或主机地址,该内存包含 VkAabbPositionsKHR 结构,其中包含几何体中每个轴对齐边界框的位置数据。 -
stride
是data
中每个条目之间的字节步长。步长必须是8
的倍数。
VkAabbPositionsKHR
结构定义为
// Provided by VK_KHR_acceleration_structure
typedef struct VkAabbPositionsKHR {
float minX;
float minY;
float minZ;
float maxX;
float maxY;
float maxZ;
} VkAabbPositionsKHR;
或等效的
// Provided by VK_NV_ray_tracing
typedef VkAabbPositionsKHR VkAabbPositionsNV;
-
minX
是边界框的一个对角角的 x 位置。 -
minY
是边界框的一个对角角的 y 位置。 -
minZ
是边界框的一个对角角的 z 位置。 -
maxX
是边界框的另一个对角角的 x 位置。 -
maxY
是边界框的另一个对角角的 y 位置。 -
maxZ
是边界框的另一个对角角的 z 位置。
VkAccelerationStructureGeometryInstancesDataKHR
结构定义为
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureGeometryInstancesDataKHR {
VkStructureType sType;
const void* pNext;
VkBool32 arrayOfPointers;
VkDeviceOrHostAddressConstKHR data;
} VkAccelerationStructureGeometryInstancesDataKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
arrayOfPointers
指定data
是用作地址数组还是仅用作数组。 -
如果
arrayOfPointers
为VK_TRUE
,则data
是指向引用单个 VkAccelerationStructureInstanceKHR 结构的设备或主机地址数组的地址,或者如运动实例中所述的打包运动实例信息,否则为 VkAccelerationStructureInstanceKHR 或 VkAccelerationStructureMotionInstanceNV 结构的数组的地址。地址和 VkAccelerationStructureInstanceKHR 结构紧密打包。VkAccelerationStructureMotionInstanceNV 结构的步长为 160 字节。
加速结构实例 可以 构建到顶层加速结构中。每个加速结构实例是顶层加速结构中的一个单独条目,其中包含在转换位置的底层加速结构的所有几何体。多个实例可以指向同一个底层加速结构。
加速结构实例由以下结构定义
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureInstanceKHR {
VkTransformMatrixKHR transform;
uint32_t instanceCustomIndex:24;
uint32_t mask:8;
uint32_t instanceShaderBindingTableRecordOffset:24;
VkGeometryInstanceFlagsKHR flags:8;
uint64_t accelerationStructureReference;
} VkAccelerationStructureInstanceKHR;
或等效的
// Provided by VK_NV_ray_tracing
typedef VkAccelerationStructureInstanceKHR VkAccelerationStructureInstanceNV;
-
transform
是一个 VkTransformMatrixKHR 结构,描述要应用于加速结构的转换。 -
instanceCustomIndex
是一个 24 位的应用程序指定索引值,可以在InstanceCustomIndexKHR
内置的射线着色器中访问。 -
mask
是一个 8 位的几何体可见性掩码。仅当Cull Mask & instance.mask != 0
时,可能会命中实例 -
instanceShaderBindingTableRecordOffset
是一个 24 位偏移量,用于计算命中着色器绑定表索引。 -
flags
是一个 8 位的 VkGeometryInstanceFlagBitsKHR 值掩码,应用于此实例。 -
accelerationStructureReference
要么是-
一个设备地址,其中包含从 vkGetAccelerationStructureDeviceAddressKHR 或 vkGetAccelerationStructureHandleNV 获取的值(由引用加速结构的设备操作使用),要么是
-
一个 VkAccelerationStructureKHR 对象(由引用加速结构的主机操作使用)。
-
C 语言规范没有定义位域的顺序,但在实践中,此结构使用现有的编译器会产生正确的布局。预期的位模式如下
-
instanceCustomIndex
和mask
占用相同的内存,如同在它们的位置指定单个uint32_t
一样-
instanceCustomIndex
占用该内存的 24 个最低有效位 -
mask
占用该内存的 8 个最高有效位
-
-
instanceShaderBindingTableRecordOffset
和flags
占用相同的内存,如同在它们的位置指定单个uint32_t
一样-
instanceShaderBindingTableRecordOffset
占用该内存的 24 个最低有效位 -
flags
占用该内存的 8 个最高有效位
-
如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法来根据正确的位模式设置值。
实例中 flags
的可能值会修改该实例的行为,如下所示
// Provided by VK_KHR_acceleration_structure
typedef enum VkGeometryInstanceFlagBitsKHR {
VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR = 0x00000001,
VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR = 0x00000002,
VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR = 0x00000004,
VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR = 0x00000008,
// Provided by VK_EXT_opacity_micromap
VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT = 0x00000010,
// Provided by VK_EXT_opacity_micromap
VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000020,
VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR,
} VkGeometryInstanceFlagBitsKHR;
或等效的
// Provided by VK_NV_ray_tracing
typedef VkGeometryInstanceFlagBitsKHR VkGeometryInstanceFlagBitsNV;
-
VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR
禁用此实例的面剔除。 -
VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR
指定此实例中几何体的 朝向确定 被反转。由于朝向是在对象空间中确定的,因此实例变换不会更改缠绕顺序,但几何体变换会更改。 -
VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR
使此实例的行为如同在此实例引用的所有几何体上都指定了VK_GEOMETRY_OPAQUE_BIT_KHR
一样。此行为可以被 SPIR-VNoOpaqueKHR
射线标志覆盖。 -
VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR
使此实例的行为如同在此实例引用的所有几何体上都未指定VK_GEOMETRY_OPAQUE_BIT_KHR
一样。此行为可以被 SPIR-VOpaqueKHR
射线标志覆盖。
VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR
和 VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR
不能在同一标志中使用。
// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkGeometryInstanceFlagsKHR;
或等效的
// Provided by VK_NV_ray_tracing
typedef VkGeometryInstanceFlagsKHR VkGeometryInstanceFlagsNV;
VkGeometryInstanceFlagsKHR
是一个位掩码类型,用于设置零个或多个 VkGeometryInstanceFlagBitsKHR 的掩码。
加速结构运动实例 可以构建到顶层加速结构中。每个加速结构实例是顶层加速结构中的一个单独条目,其中包括在转换位置的底层加速结构的所有几何体,以及运动类型和用于确定实例随时间变化的运动的参数。
加速结构运动实例由以下结构定义
// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureMotionInstanceNV {
VkAccelerationStructureMotionInstanceTypeNV type;
VkAccelerationStructureMotionInstanceFlagsNV flags;
VkAccelerationStructureMotionInstanceDataNV data;
} VkAccelerationStructureMotionInstanceNV;
-
type
是一个 VkAccelerationStructureMotionInstanceTypeNV 枚举值,标识此运动实例的类型以及联合的有效类型。 -
flags
当前未使用,但需要保持data
的自然对齐。 -
data
是一个 VkAccelerationStructureMotionInstanceDataNV,其中包含此实例的运动实例数据。
如果使用标准 C 编译器以外的其他编译器编写此结构,请注意最终结构应为 152 字节大小。 |
加速结构运动实例由联合定义
// Provided by VK_NV_ray_tracing_motion_blur
typedef union VkAccelerationStructureMotionInstanceDataNV {
VkAccelerationStructureInstanceKHR staticInstance;
VkAccelerationStructureMatrixMotionInstanceNV matrixMotionInstance;
VkAccelerationStructureSRTMotionInstanceNV srtMotionInstance;
} VkAccelerationStructureMotionInstanceDataNV;
-
staticInstance
是一个 VkAccelerationStructureInstanceKHR 结构,其中包含静态实例的数据。 -
matrixMotionInstance
是一个 VkAccelerationStructureMatrixMotionInstanceNV 结构,其中包含矩阵运动实例的数据。 -
srtMotionInstance
是一个 VkAccelerationStructureSRTMotionInstanceNV 结构,其中包含 SRT 运动实例的数据。
// Provided by VK_NV_ray_tracing_motion_blur
typedef VkFlags VkAccelerationStructureMotionInstanceFlagsNV;
VkAccelerationStructureMotionInstanceFlagsNV
是一个位掩码类型,用于设置掩码,但目前保留供将来使用。
VkAccelerationStructureMotionInstanceTypeNV
枚举定义为
// Provided by VK_NV_ray_tracing_motion_blur
typedef enum VkAccelerationStructureMotionInstanceTypeNV {
VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV = 0,
VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV = 1,
VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV = 2,
} VkAccelerationStructureMotionInstanceTypeNV;
-
VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_STATIC_NV
指定实例为静态实例,没有实例运动。 -
VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_MATRIX_MOTION_NV
指定实例为运动实例,运动由两个矩阵之间的插值指定。 -
VK_ACCELERATION_STRUCTURE_MOTION_INSTANCE_TYPE_SRT_MOTION_NV
指定实例为运动实例,运动由 SRT 分解中的插值指定。
加速结构矩阵运动实例由以下结构定义
// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureMatrixMotionInstanceNV {
VkTransformMatrixKHR transformT0;
VkTransformMatrixKHR transformT1;
uint32_t instanceCustomIndex:24;
uint32_t mask:8;
uint32_t instanceShaderBindingTableRecordOffset:24;
VkGeometryInstanceFlagsKHR flags:8;
uint64_t accelerationStructureReference;
} VkAccelerationStructureMatrixMotionInstanceNV;
-
transformT0
是一个 VkTransformMatrixKHR 结构,描述在时间 0 应用于加速结构的转换。 -
transformT1
是一个 VkTransformMatrixKHR 结构,描述在时间 1 应用于加速结构的转换。 -
instanceCustomIndex
是一个 24 位的应用程序指定索引值,可以在InstanceCustomIndexKHR
内置的射线着色器中访问。 -
mask
是一个 8 位的几何体可见性掩码。仅当Cull Mask & instance.mask != 0
时,可能会命中实例 -
instanceShaderBindingTableRecordOffset
是一个 24 位偏移量,用于计算命中着色器绑定表索引。 -
flags
是一个 8 位的 VkGeometryInstanceFlagBitsKHR 值掩码,应用于此实例。 -
accelerationStructureReference
要么是-
一个设备地址,其中包含从 vkGetAccelerationStructureDeviceAddressKHR 或 vkGetAccelerationStructureHandleNV 获取的值(由引用加速结构的设备操作使用),要么是
-
一个 VkAccelerationStructureKHR 对象(由引用加速结构的主机操作使用)。
-
C 语言规范没有定义位域的顺序,但在实践中,此结构使用现有的编译器会产生正确的布局。预期的位模式如下
-
instanceCustomIndex
和mask
占用相同的内存,如同在它们的位置指定单个uint32_t
一样-
instanceCustomIndex
占用该内存的 24 个最低有效位 -
mask
占用该内存的 8 个最高有效位
-
-
instanceShaderBindingTableRecordOffset
和flags
占用相同的内存,如同在它们的位置指定单个uint32_t
一样-
instanceShaderBindingTableRecordOffset
占用该内存的 24 个最低有效位 -
flags
占用该内存的 8 个最高有效位
-
如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法来根据正确的位模式设置值。
在时间点上,矩阵运动实例的变换是通过对两个变换进行逐分量线性插值得到的。也就是说,对于 [0,1] 中的 time
,得到的变换是:
-
transformT0
× (1 -time
) +transformT1
×time
加速结构 SRT 运动实例由以下结构定义:
// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureSRTMotionInstanceNV {
VkSRTDataNV transformT0;
VkSRTDataNV transformT1;
uint32_t instanceCustomIndex:24;
uint32_t mask:8;
uint32_t instanceShaderBindingTableRecordOffset:24;
VkGeometryInstanceFlagsKHR flags:8;
uint64_t accelerationStructureReference;
} VkAccelerationStructureSRTMotionInstanceNV;
-
transformT0
是一个 VkSRTDataNV 结构,描述在时间 0 时应用于加速结构的变换。 -
transformT1
是一个 VkSRTDataNV 结构,描述在时间 1 时应用于加速结构的变换。 -
instanceCustomIndex
是一个 24 位的应用程序指定索引值,可以在InstanceCustomIndexKHR
内置的射线着色器中访问。 -
mask
是一个 8 位的几何体可见性掩码。仅当Cull Mask & instance.mask != 0
时,可能会命中实例 -
instanceShaderBindingTableRecordOffset
是一个 24 位偏移量,用于计算命中着色器绑定表索引。 -
flags
是一个 8 位的 VkGeometryInstanceFlagBitsKHR 值掩码,应用于此实例。 -
accelerationStructureReference
要么是-
一个设备地址,其中包含从 vkGetAccelerationStructureDeviceAddressKHR 或 vkGetAccelerationStructureHandleNV 获取的值(由引用加速结构的设备操作使用),要么是
-
一个 VkAccelerationStructureKHR 对象(由引用加速结构的主机操作使用)。
-
C 语言规范没有定义位域的顺序,但在实践中,此结构使用现有的编译器会产生正确的布局。预期的位模式如下
-
instanceCustomIndex
和mask
占用相同的内存,如同在它们的位置指定单个uint32_t
一样-
instanceCustomIndex
占用该内存的 24 个最低有效位 -
mask
占用该内存的 8 个最高有效位
-
-
instanceShaderBindingTableRecordOffset
和flags
占用相同的内存,如同在它们的位置指定单个uint32_t
一样-
instanceShaderBindingTableRecordOffset
占用该内存的 24 个最低有效位 -
flags
占用该内存的 8 个最高有效位
-
如果编译器生成的代码与该模式不同,则应用程序必须采用其他方法来根据正确的位模式设置值。
在时间点上,SRT 运动实例的变换是通过对两个 SRT 变换进行逐分量线性插值得到的。也就是说,对于 [0,1] 中的 time
,得到的变换是:
-
transformT0
× (1 -time
) +transformT1
×time
加速结构 SRT 变换由以下结构定义:
// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkSRTDataNV {
float sx;
float a;
float b;
float pvx;
float sy;
float c;
float pvy;
float sz;
float pvz;
float qx;
float qy;
float qz;
float qw;
float tx;
float ty;
float tz;
} VkSRTDataNV;
-
sx
是变换的缩放的 x 分量 -
a
是变换的剪切的一个分量 -
b
是变换的剪切的一个分量 -
pvx
是变换的枢轴点的 x 分量 -
sy
是变换的缩放的 y 分量 -
c
是变换的剪切的一个分量 -
pvy
是变换的枢轴点的 y 分量 -
sz
是变换的缩放的 z 分量 -
pvz
是变换的枢轴点的 z 分量 -
qx
是旋转四元数的 x 分量 -
qy
是旋转四元数的 y 分量 -
qz
是旋转四元数的 z 分量 -
qw
是旋转四元数的 w 分量 -
tx
是旋转后平移的 x 分量 -
ty
是旋转后平移的 y 分量 -
tz
是旋转后平移的 z 分量
此变换分解包含三个元素。第一个是矩阵 S,由缩放、剪切和平移组成,通常用于定义后续旋转的枢轴点。此矩阵由以下参数构造:
旋转四元数定义为:
-
R
= [qx
,qy
,qz
,qw
]
这是一个围绕概念归一化轴 [ ax, ay, az ] 旋转 theta
角度的旋转,使得:
-
[
qx
,qy
,qz
] = sin(theta
/2) × [ax
,ay
,az
]
和
-
qw
= cos(theta
/2)
最后,变换有一个平移 T,由以上参数构建:
最终得到的有效变换为:
-
T
×R
×S
VkAccelerationStructureBuildRangeInfoKHR
定义为:
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureBuildRangeInfoKHR {
uint32_t primitiveCount;
uint32_t primitiveOffset;
uint32_t firstVertex;
uint32_t transformOffset;
} VkAccelerationStructureBuildRangeInfoKHR;
-
primitiveCount
定义了对应加速结构几何体的图元数量。 -
primitiveOffset
定义了图元数据定义所在的内存中的字节偏移量。 -
firstVertex
是要构建的第一个顶点的索引(用于三角形几何体)。 -
transformOffset
定义了变换矩阵定义所在的内存中的字节偏移量。
图元计数和图元偏移量的解释方式取决于使用的 VkGeometryTypeKHR。
-
对于类型为
VK_GEOMETRY_TYPE_TRIANGLES_KHR
的几何体,primitiveCount
是要构建的三角形数量,其中每个三角形被视为 3 个顶点。-
如果几何体使用索引,则从 VkAccelerationStructureGeometryTrianglesDataKHR::
indexData
中消耗primitiveCount
× 3 个索引,从primitiveOffset
偏移量开始。在获取顶点之前,将firstVertex
的值添加到索引值。 -
如果几何体不使用索引,则从 VkAccelerationStructureGeometryTrianglesDataKHR::
vertexData
中消耗primitiveCount
× 3 个顶点,从primitiveOffset
+ VkAccelerationStructureGeometryTrianglesDataKHR::vertexStride
×firstVertex
偏移量开始。 -
如果 VkAccelerationStructureGeometryTrianglesDataKHR::
transformData
不为NULL
,则从 VkAccelerationStructureGeometryTrianglesDataKHR::transformData
中消耗一个 VkTransformMatrixKHR 结构,偏移量为transformOffset
。此矩阵描述了此几何体中所有三角形的顶点所在的空间到加速结构定义所在的空间的变换。
-
-
对于类型为
VK_GEOMETRY_TYPE_AABBS_KHR
的几何体,primitiveCount
是轴对齐边界框的数量。从 VkAccelerationStructureGeometryAabbsDataKHR::data
中消耗primitiveCount
个 VkAabbPositionsKHR 结构,从primitiveOffset
偏移量开始。 -
对于类型为
VK_GEOMETRY_TYPE_INSTANCES_KHR
的几何体,primitiveCount
是加速结构的数目。从 VkAccelerationStructureGeometryInstancesDataKHR::data
中消耗primitiveCount
个 VkAccelerationStructureInstanceKHR 或 VkAccelerationStructureMotionInstanceNV 结构,从primitiveOffset
偏移量开始。
复制加速结构
存在一个额外的命令,用于复制加速结构而不更新其内容。加速结构对象可以被压缩以提高性能。在复制之前,应用程序必须查询生成的加速结构的大小。
要查询加速结构大小参数,请调用
// Provided by VK_KHR_acceleration_structure
void vkCmdWriteAccelerationStructuresPropertiesKHR(
VkCommandBuffer commandBuffer,
uint32_t accelerationStructureCount,
const VkAccelerationStructureKHR* pAccelerationStructures,
VkQueryType queryType,
VkQueryPool queryPool,
uint32_t firstQuery);
-
commandBuffer
是将记录命令的命令缓冲区。 -
accelerationStructureCount
是要查询属性的加速结构的计数。 -
pAccelerationStructures
是指向先前构建的现有加速结构数组的指针。 -
queryType
是一个 VkQueryType 值,指定由池管理的查询类型。 -
queryPool
是将管理查询结果的查询池。 -
firstQuery
是查询池中第一个查询索引,其中将包含accelerationStructureCount
个结果。
对 pAccelerationStructures
中列出的任何加速结构的访问必须与 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR
管线阶段或 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段同步,并且具有 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR
的 访问类型。
-
如果
queryType
是VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR
,则写入的值是压缩的加速结构所需的字节数。 -
如果
queryType
是VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
,则写入的值是序列化的加速结构所需的字节数。
要查询加速结构大小参数,请调用
// Provided by VK_NV_ray_tracing
void vkCmdWriteAccelerationStructuresPropertiesNV(
VkCommandBuffer commandBuffer,
uint32_t accelerationStructureCount,
const VkAccelerationStructureNV* pAccelerationStructures,
VkQueryType queryType,
VkQueryPool queryPool,
uint32_t firstQuery);
-
commandBuffer
是将记录命令的命令缓冲区。 -
accelerationStructureCount
是要查询属性的加速结构的计数。 -
pAccelerationStructures
是指向先前构建的现有加速结构数组的指针。 -
queryType
是一个 VkQueryType 值,指定由池管理的查询类型。 -
queryPool
是将管理查询结果的查询池。 -
firstQuery
是查询池中第一个查询索引,其中将包含accelerationStructureCount
个结果。
要复制加速结构,请调用
// Provided by VK_NV_ray_tracing
void vkCmdCopyAccelerationStructureNV(
VkCommandBuffer commandBuffer,
VkAccelerationStructureNV dst,
VkAccelerationStructureNV src,
VkCopyAccelerationStructureModeKHR mode);
-
commandBuffer
是将记录命令的命令缓冲区。 -
dst
是复制的目标加速结构。 -
src
是复制的源加速结构。 -
mode
是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。
要复制加速结构,请调用
// Provided by VK_KHR_acceleration_structure
void vkCmdCopyAccelerationStructureKHR(
VkCommandBuffer commandBuffer,
const VkCopyAccelerationStructureInfoKHR* pInfo);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pInfo
是一个指向 VkCopyAccelerationStructureInfoKHR 结构的指针,该结构定义了复制操作。
此命令按照 pInfo->mode
指定的方式将 pInfo->src
加速结构复制到 pInfo->dst
加速结构。
VkCopyAccelerationStructureInfoKHR
结构的定义如下:
// Provided by VK_KHR_acceleration_structure
typedef struct VkCopyAccelerationStructureInfoKHR {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureKHR src;
VkAccelerationStructureKHR dst;
VkCopyAccelerationStructureModeKHR mode;
} VkCopyAccelerationStructureInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
src
是复制的源加速结构。 -
dst
是复制的目标加速结构。 -
mode
是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。
mode
的可能值指定在复制期间执行的其他操作,包括:
// Provided by VK_KHR_acceleration_structure
typedef enum VkCopyAccelerationStructureModeKHR {
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR = 0,
VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR = 1,
// Provided by VK_KHR_acceleration_structure
VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR = 2,
// Provided by VK_KHR_acceleration_structure
VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR = 3,
// Provided by VK_NV_ray_tracing
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV = VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR,
// Provided by VK_NV_ray_tracing
VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV = VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR,
} VkCopyAccelerationStructureModeKHR;
或等效的
// Provided by VK_NV_ray_tracing
typedef VkCopyAccelerationStructureModeKHR VkCopyAccelerationStructureModeNV;
-
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR
创建src
中指定的加速结构的直接副本,并将其复制到dst
指定的加速结构中。dst
加速结构 必须使用与src
相同的参数创建。如果src
包含对其他加速结构的引用,则dst
将引用相同的加速结构。 -
VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR
创建一个更紧凑版本的加速结构src
到dst
中。加速结构dst
的大小 必须至少与 vkCmdWriteAccelerationStructuresPropertiesNV、vkCmdWriteAccelerationStructuresPropertiesKHR 或 vkWriteAccelerationStructuresPropertiesKHR 在构建src
指定的加速结构后返回的大小一样大。如果src
包含对其他加速结构的引用,则dst
将引用相同的加速结构。 -
VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR
将加速结构序列化为半透明格式,可以在兼容的实现上重新加载。 -
VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR
将缓冲区中的半透明序列化格式反序列化为加速结构。
要将加速结构复制到设备内存,请调用
// Provided by VK_KHR_acceleration_structure
void vkCmdCopyAccelerationStructureToMemoryKHR(
VkCommandBuffer commandBuffer,
const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pInfo
是指向 VkCopyAccelerationStructureToMemoryInfoKHR 结构的指针,该结构定义了复制操作。
对 pInfo->src
的访问 必须与 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR
管线阶段 或 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段,以及 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR
的 访问类型 进行同步。对 pInfo->dst.deviceAddress
指示的缓冲区的访问 必须与 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR
管线阶段 或 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段,以及 VK_ACCESS_TRANSFER_WRITE_BIT
的访问类型进行同步。
此命令产生与 vkCopyAccelerationStructureToMemoryKHR 相同的结果,但将其结果写入设备地址,并在设备而不是主机上执行。输出 可能不一定逐位相同,但它可以同样被 vkCmdCopyMemoryToAccelerationStructureKHR 或 vkCopyMemoryToAccelerationStructureKHR 使用。
序列化数据的定义头结构由以下组成:
-
与
VkPhysicalDeviceIDProperties
::driverUUID
匹配的VK_UUID_SIZE
字节的数据 -
VK_UUID_SIZE
字节的数据,用于标识使用 vkGetDeviceAccelerationStructureCompatibilityKHR 进行比较的兼容性 -
一个 64 位整数,表示与使用
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
查询的值匹配的总大小 -
一个 64 位整数,表示要传递给
VkAccelerationStructureCreateInfoKHR
::size
的反序列化大小 -
一个 64 位整数,表示后面加速结构句柄的数量。此值与使用
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR
查询的值匹配。对于底层加速结构,此值将为零。对于顶层加速结构,此数字取决于实现;句柄的数量和顺序可能与用于构建加速结构的实例描述不匹配。
与 vkGetAccelerationStructureDeviceAddressKHR 或 vkGetAccelerationStructureHandleNV 返回值对应的句柄,紧密排列在缓冲区中,并紧随计数之后。应用程序应存储这些句柄与原始应用程序生成的底层加速结构之间的映射,以便在反序列化时提供。序列化数据根据主机字节序写入缓冲区(或从缓冲区读取)。
// Provided by VK_KHR_acceleration_structure
typedef struct VkCopyAccelerationStructureToMemoryInfoKHR {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureKHR src;
VkDeviceOrHostAddressKHR dst;
VkCopyAccelerationStructureModeKHR mode;
} VkCopyAccelerationStructureToMemoryInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
src
是复制的源加速结构 -
dst
是设备或主机内存地址,作为复制的目标 -
mode
是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。
要将设备内存复制到加速结构,请调用
// Provided by VK_KHR_acceleration_structure
void vkCmdCopyMemoryToAccelerationStructureKHR(
VkCommandBuffer commandBuffer,
const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pInfo
是指向 VkCopyMemoryToAccelerationStructureInfoKHR 结构的指针,该结构定义了复制操作。
对 pInfo->dst
的访问必须与 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR
管线阶段 或 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段 以及 VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR
的 访问类型 同步。 对 pInfo->src.deviceAddress
指示的缓冲区的访问必须与 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR
管线阶段 或 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
管线阶段 以及 VK_ACCESS_TRANSFER_READ_BIT
的访问类型同步。
此命令可以接受由 vkCmdCopyAccelerationStructureToMemoryKHR 或 vkCopyAccelerationStructureToMemoryKHR 生成的加速结构。
反序列化的输入结构如 vkCmdCopyAccelerationStructureToMemoryKHR 中所述,其中任何加速结构句柄都填充了在反序列化之前创建的底层加速结构的新查询句柄。这些句柄在反序列化时不需要构建,但必须创建。
VkCopyMemoryToAccelerationStructureInfoKHR
结构定义如下:
// Provided by VK_KHR_acceleration_structure
typedef struct VkCopyMemoryToAccelerationStructureInfoKHR {
VkStructureType sType;
const void* pNext;
VkDeviceOrHostAddressConstKHR src;
VkAccelerationStructureKHR dst;
VkCopyAccelerationStructureModeKHR mode;
} VkCopyMemoryToAccelerationStructureInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
src
是指向包含复制源数据的内存的设备或主机地址。 -
dst
是复制的目标加速结构。 -
mode
是一个 VkCopyAccelerationStructureModeKHR 值,指定复制期间要执行的附加操作。
要检查序列化的加速结构是否与当前设备兼容,请调用:
// Provided by VK_KHR_acceleration_structure
void vkGetDeviceAccelerationStructureCompatibilityKHR(
VkDevice device,
const VkAccelerationStructureVersionInfoKHR* pVersionInfo,
VkAccelerationStructureCompatibilityKHR* pCompatibility);
-
device
是要检查版本的设备。 -
pVersionInfo
是指向 VkAccelerationStructureVersionInfoKHR 结构的指针,该结构指定要与设备进行检查的版本信息。 -
pCompatibility
是指向 VkAccelerationStructureCompatibilityKHR 值的指针,其中返回兼容性信息。
VkAccelerationStructureVersionInfoKHR
结构定义如下:
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureVersionInfoKHR {
VkStructureType sType;
const void* pNext;
const uint8_t* pVersionData;
} VkAccelerationStructureVersionInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
pVersionData
是指向加速结构版本头的指针,如 vkCmdCopyAccelerationStructureToMemoryKHR 中所定义。
|
vkGetDeviceAccelerationStructureCompatibilityKHR 返回的 pCompatibility
可能的值为:
// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureCompatibilityKHR {
VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR = 0,
VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR = 1,
} VkAccelerationStructureCompatibilityKHR;
-
如果
pVersionData
版本加速结构与device
兼容,则为VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR
。 -
如果
pVersionData
版本加速结构与device
不兼容,则为VK_ACCELERATION_STRUCTURE_COMPATIBILITY_INCOMPATIBLE_KHR
。
主机加速结构操作
如果启用了 accelerationStructureHostCommands
功能,则实现还必须提供加速结构操作的主机实现。
-
对应于 vkCmdBuildAccelerationStructuresKHR 的 vkBuildAccelerationStructuresKHR
-
对应于 vkCmdCopyAccelerationStructureKHR 的 vkCopyAccelerationStructureKHR
-
对应于 vkCmdCopyAccelerationStructureToMemoryKHR 的 vkCopyAccelerationStructureToMemoryKHR
-
对应于 vkCmdCopyMemoryToAccelerationStructureKHR 的 vkCopyMemoryToAccelerationStructureKHR
-
对应于 vkCmdWriteAccelerationStructuresPropertiesKHR 的 vkWriteAccelerationStructuresPropertiesKHR
这些命令在功能上与其设备对应项相同,只是它们是在主机时间线上执行,而不是排队到命令缓冲区中。
主机命令使用的所有加速结构必须绑定到主机可见内存,并且加速结构构建的所有输入数据必须使用主机地址而不是设备地址引用。应用程序在使用主机命令时不需要映射加速结构内存。
vkBuildAccelerationStructuresKHR 和 vkCmdBuildAccelerationStructuresKHR 可能使用不同的算法,因此不要求生成相同的结构。这两个命令生成的结构可能表现出不同的内存占用或遍历性能,但应尽可能相似。 除了这些细节之外,主机和设备操作是可互换的。例如,应用程序可以使用 vkBuildAccelerationStructuresKHR 构建结构,使用 vkCmdCopyAccelerationStructureKHR 在设备上压缩它,并使用 vkCopyAccelerationStructureToMemoryKHR 序列化结果。 |
为了高效执行,使用这些命令操作的加速结构应始终绑定到主机缓存内存,因为实现可能需要在命令执行期间重复读取和写入此内存。 |
要在主机上构建加速结构,请调用
// Provided by VK_KHR_acceleration_structure
VkResult vkBuildAccelerationStructuresKHR(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos);
-
device
是正在构建加速结构的VkDevice
。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于请求延迟此命令。 -
infoCount
是要构建的加速结构的数目。它指定必须提供的pInfos
结构和ppBuildRangeInfos
指针的数量。 -
pInfos
是指向infoCount
个 VkAccelerationStructureBuildGeometryInfoKHR 结构数组的指针,这些结构定义了用于构建每个加速结构的几何图形。 -
ppBuildRangeInfos
是指向infoCount
个指针数组的指针,这些指针数组指向 VkAccelerationStructureBuildRangeInfoKHR 结构。每个ppBuildRangeInfos
[i] 是指向pInfos
[i].geometryCount
个 VkAccelerationStructureBuildRangeInfoKHR 结构数组的指针,这些结构定义了指向存储几何数据的地址的动态偏移,如pInfos
[i] 所定义。
此命令执行与 vkCmdBuildAccelerationStructuresKHR 相同的任务,但由主机执行。
vkBuildAccelerationStructuresKHR
命令提供了启动多个加速结构构建的能力,但是任何单独的加速结构构建之间都没有隐含的排序或同步。
这意味着应用程序不能在同一个 vkBuildAccelerationStructuresKHR 调用中构建顶层加速结构,同时构建相关的底层或实例加速结构。任何构建使用的任何加速结构内存或临时内存之间也不能有任何内存别名。 |
要在主机上复制或压缩加速结构,请调用
// Provided by VK_KHR_acceleration_structure
VkResult vkCopyAccelerationStructureKHR(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
const VkCopyAccelerationStructureInfoKHR* pInfo);
-
device
是拥有加速结构的设备。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于请求延迟此命令。 -
pInfo
是一个指向 VkCopyAccelerationStructureInfoKHR 结构的指针,该结构定义了复制操作。
此命令执行与 vkCmdCopyAccelerationStructureKHR 相同的任务,但由主机执行。
要将主机可访问内存复制到加速结构,请调用
// Provided by VK_KHR_acceleration_structure
VkResult vkCopyMemoryToAccelerationStructureKHR(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo);
-
device
是拥有pInfo->dst
的设备。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于请求延迟此命令。 -
pInfo
是指向 VkCopyMemoryToAccelerationStructureInfoKHR 结构的指针,该结构定义了复制操作。
此命令执行与 vkCmdCopyMemoryToAccelerationStructureKHR 相同的任务,但由主机执行。
此命令可以接受由 vkCmdCopyAccelerationStructureToMemoryKHR 或 vkCopyAccelerationStructureToMemoryKHR 生成的加速结构。
要将加速结构复制到主机可访问内存,请调用
// Provided by VK_KHR_acceleration_structure
VkResult vkCopyAccelerationStructureToMemoryKHR(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo);
-
device
是拥有pInfo->src
的设备。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于请求延迟此命令。 -
pInfo
是指向定义复制操作的 VkCopyAccelerationStructureToMemoryInfoKHR 结构的指针。
此命令执行与 vkCmdCopyAccelerationStructureToMemoryKHR 相同的任务,但由主机执行。
此命令产生与 vkCmdCopyAccelerationStructureToMemoryKHR 相同的结果,但将其结果直接写入主机指针,并在主机而不是设备上执行。输出可能不一定完全逐位相同,但它可以被 vkCmdCopyMemoryToAccelerationStructureKHR 或 vkCopyMemoryToAccelerationStructureKHR 同等使用。
要在主机上查询加速结构大小参数,请调用
// Provided by VK_KHR_acceleration_structure
VkResult vkWriteAccelerationStructuresPropertiesKHR(
VkDevice device,
uint32_t accelerationStructureCount,
const VkAccelerationStructureKHR* pAccelerationStructures,
VkQueryType queryType,
size_t dataSize,
void* pData,
size_t stride);
-
device
是拥有pAccelerationStructures
中加速结构的设备。 -
accelerationStructureCount
是要查询属性的加速结构的计数。 -
pAccelerationStructures
是指向先前构建的现有加速结构数组的指针。 -
queryType
是一个 VkQueryType 值,指定要查询的属性。 -
dataSize
是pData
指向的缓冲区的大小(以字节为单位)。 -
pData
是一个指向应用程序分配的缓冲区的指针,结果将写入其中。 -
stride
是pData
中各个查询结果之间的步幅(以字节为单位)。
此命令执行与 vkCmdWriteAccelerationStructuresPropertiesKHR 相同的任务,但由主机执行。