微型映射
微型映射
加速结构存储和组织用于光线追踪的几何体,但在某些情况下,在几何体中包含一些信息是有益的,特别是对于三角形而言。微型映射围绕一个与细分的微型三角形相对应的值映射组织这些数据,这些微型三角形可以在构建底层加速结构时添加到三角形几何体中。
不透明度微型映射是一种微型映射,它存储信息以控制交叉不透明度,如 射线不透明度微型映射 中所述。
位移微型映射是一种微型映射,它存储信息以位移子三角形顶点,如 位移微型映射 中所述。
构建微型映射
要构建微型映射,请调用
// Provided by VK_EXT_opacity_micromap
void vkCmdBuildMicromapsEXT(
VkCommandBuffer commandBuffer,
uint32_t infoCount,
const VkMicromapBuildInfoEXT* pInfos);
-
commandBuffer
是命令缓冲区,命令将被记录到该缓冲区中。 -
infoCount
是要构建的微型映射的数量。它指定了必须提供的pInfos
结构的数目。 -
pInfos
是指向infoCount
个 VkMicromapBuildInfoEXT 结构的数组的指针,这些结构定义了用于构建每个微型映射的数据。
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::data
或 VkMicromapBuildInfoEXT::triangleArray
值标识的其他输入缓冲区的访问必须与 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT
管线阶段 和 VK_ACCESS_SHADER_READ_BIT
的 访问类型 同步。
微映射构建中可以在 VkMicromapUsageEXT::format
和 VkMicromapTriangleEXT::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::format
和 VkMicromapTriangleEXT::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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
type
是一个 VkMicromapTypeEXT 值,指定正在构建的微映射的类型。 -
flags
是一个 VkBuildMicromapFlagBitsEXT 的位掩码,指定微映射的附加参数。 -
mode
是一个 VkBuildMicromapModeEXT 值,指定要执行的操作类型。 -
dstMicromap
是指向用于构建的目标微型映射的指针。 -
usageCountsCount
指定将用于确定此微型映射大小的使用计数结构的数目。 -
pUsageCounts
是指向 VkMicromapUsageEXT 结构数组的指针。 -
ppUsageCounts
是指向 VkMicromapUsageEXT 结构指针数组的指针。 -
data
是指向包含微型映射数据的内存的设备或主机地址。 -
scratchData
是指向将用作构建的临时内存的设备或主机地址。 -
triangleArray
是指向包含 VkMicromapTriangleEXT 数据的内存的设备或主机地址。 -
triangleArrayStride
是triangleArray
的每个元素之间的字节步幅。
pUsageCounts
和 ppUsageCounts
中只能有一个是指向有效指针,另一个**必须**为 NULL
。非 NULL
数组的元素描述了用于构建每个微型映射的总计数。每个元素包含一个 count
,它是该微型映射中包含的具有该 format
和 subdivisionLevel
的微型映射三角形的数量。允许具有相同 format
和 subdivisionLevel
的多个元素,并且该 format
和 subdivisionLevel
的总计数是每个元素的 count
之和。
每个微型映射三角形都引用 triangleArray
中的一个元素,该元素包含该特定三角形的 format
和 subdivisionLevel
,以及一个以字节为单位的 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
处的数据的解释在 位移微型映射编码 中讨论。
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
是微型映射中由下面的subdivisionLevel
和format
定义的使用格式中的三角形数量。 -
subdivisionLevel
是此使用格式的细分级别。 -
format
是此使用格式的格式。
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
是此三角形的格式。
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
的 访问类型 同步。
-
如果
queryType
为VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT
,则写出的值是序列化微型映射所需的字节数。 -
如果
queryType
为VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT
,则写出的值是压缩微型映射所需的字节数。
要复制微型映射,请调用
// Provided by VK_EXT_opacity_micromap
void vkCmdCopyMicromapEXT(
VkCommandBuffer commandBuffer,
const VkCopyMicromapInfoEXT* pInfo);
-
commandBuffer
是命令缓冲区,命令将被记录到该缓冲区中。 -
pInfo
是指向 VkCopyMicromapInfoEXT 结构的指针,该结构定义复制操作。
此命令以 pInfo->mode
指定的方式将 pInfo->src
微型映射复制到 pInfo->dst
微型映射。
VkCopyMicromapInfoEXT
结构定义如下
// Provided by VK_EXT_opacity_micromap
typedef struct VkCopyMicromapInfoEXT {
VkStructureType sType;
const void* pNext;
VkMicromapEXT src;
VkMicromapEXT dst;
VkCopyMicromapModeEXT mode;
} VkCopyMicromapInfoEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
src
是复制操作的源微型映射。 -
dst
是复制操作的目标微型映射。 -
mode
是一个 VkCopyMicromapModeEXT 值,指定在复制期间执行的其他操作。
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 相同的结果,但将其结果写入设备地址,并在设备而不是主机上执行。输出可能不一定是逐位相同的,但它可以同样被 vkCmdCopyMemoryToMicromapEXT 或 vkCopyMemoryToMicromapEXT 使用。
序列化数据的已定义头结构包括
-
VK_UUID_SIZE
字节的数据,与VkPhysicalDeviceIDProperties
::driverUUID
匹配 -
VK_UUID_SIZE
字节的数据,用于使用 vkGetDeviceMicromapCompatibilityEXT 识别比较的兼容性。序列化数据根据主机字节序写入缓冲区(或从缓冲区读取)。
// Provided by VK_EXT_opacity_micromap
typedef struct VkCopyMicromapToMemoryInfoEXT {
VkStructureType sType;
const void* pNext;
VkMicromapEXT src;
VkDeviceOrHostAddressKHR dst;
VkCopyMicromapModeEXT mode;
} VkCopyMicromapToMemoryInfoEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
src
是复制操作的源微型映射 -
dst
是设备或主机内存地址,它是复制操作的目标 -
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
的访问类型同步。
此命令可以接受由 vkCmdCopyMicromapToMemoryEXT 或 vkCopyMicromapToMemoryEXT 生成的微型地图。
VkCopyMemoryToMicromapInfoEXT
结构的定义如下:
// Provided by VK_EXT_opacity_micromap
typedef struct VkCopyMemoryToMicromapInfoEXT {
VkStructureType sType;
const void* pNext;
VkDeviceOrHostAddressConstKHR src;
VkMicromapEXT dst;
VkCopyMicromapModeEXT mode;
} VkCopyMemoryToMicromapInfoEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
src
是设备或主机地址,其中包含复制操作的源数据。 -
dst
是复制操作的目标微型映射。 -
mode
是一个 VkCopyMicromapModeEXT 值,指定在复制期间执行的其他操作。
要检查序列化的微型地图是否与当前设备兼容,请调用
// Provided by VK_EXT_opacity_micromap
void vkGetDeviceMicromapCompatibilityEXT(
VkDevice device,
const VkMicromapVersionInfoEXT* pVersionInfo,
VkAccelerationStructureCompatibilityKHR* pCompatibility);
-
device
是要检查版本的设备。 -
pVersionInfo
是指向 VkMicromapVersionInfoEXT 结构的指针,该结构指定要对照设备检查的版本信息。 -
pCompatibility
是指向 VkAccelerationStructureCompatibilityKHR 值的指针,其中返回兼容性信息。
VkMicromapVersionInfoEXT
结构的定义如下:
// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapVersionInfoEXT {
VkStructureType sType;
const void* pNext;
const uint8_t* pVersionData;
} VkMicromapVersionInfoEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
pVersionData
是指向微型地图版本头的指针,如 vkCmdCopyMicromapToMemoryEXT 中定义。
|
主机微型映射操作
如果启用了 micromapHostCommands
功能,则还要求实现提供微型映射操作的主机实现。
这些命令在功能上与其设备对应命令相同,只是它们在主机时间线上执行,而不是排队到命令缓冲区中。
主机命令使用的所有微映射必须绑定到主机可见内存,并且微映射构建的所有输入数据必须使用主机地址而不是设备地址进行引用。使用主机命令时,应用程序不需要映射微映射内存。
vkBuildMicromapsEXT 和 vkCmdBuildMicromapsEXT 可能使用不同的算法,因此不需要产生相同的结构。 除了这些细节之外,主机和设备操作是可互换的。 |
为了高效执行,使用这些命令操作的微映射应始终绑定到主机缓存内存,因为在命令执行期间,实现可能需要重复读取和写入此内存。 |
要在主机上构建微映射,请调用
// 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
是指向infoCount
个 VkMicromapBuildInfoEXT 结构的数组的指针,这些结构定义了用于构建每个微映射的几何图形。
此命令执行与 vkCmdBuildMicromapsEXT 相同的任务,但由主机执行。
vkBuildMicromapsEXT
命令提供了启动多个微映射构建的能力,但是,任何单个微映射构建之间都没有暗示任何排序或同步。
这意味着任何构建使用的任何微型映射内存或暂存内存之间不能存在任何内存别名。 |
要在主机上复制或压缩微映射,请调用
// Provided by VK_EXT_opacity_micromap
VkResult vkCopyMicromapEXT(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
const VkCopyMicromapInfoEXT* pInfo);
-
device
是拥有微映射的设备。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于 请求延迟 此命令。 -
pInfo
是指向 VkCopyMicromapInfoEXT 结构的指针,该结构定义复制操作。
此命令执行与 vkCmdCopyMicromapEXT 相同的任务,但由主机执行。
要将主机可访问内存复制到微映射,请调用
// Provided by VK_EXT_opacity_micromap
VkResult vkCopyMemoryToMicromapEXT(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
const VkCopyMemoryToMicromapInfoEXT* pInfo);
-
device
是拥有pInfo->dst
的设备。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于 请求延迟 此命令。 -
pInfo
是指向 VkCopyMemoryToMicromapInfoEXT 结构的指针,该结构定义了复制操作。
此命令执行与 vkCmdCopyMemoryToMicromapEXT 相同的任务,但由主机执行。
此命令可以接受由 vkCmdCopyMicromapToMemoryEXT 或 vkCopyMicromapToMemoryEXT 生成的微型地图。
要将微型映射复制到主机可访问的内存,请调用
// Provided by VK_EXT_opacity_micromap
VkResult vkCopyMicromapToMemoryEXT(
VkDevice device,
VkDeferredOperationKHR deferredOperation,
const VkCopyMicromapToMemoryInfoEXT* pInfo);
-
device
是拥有pInfo->src
的设备。 -
deferredOperation
是一个可选的 VkDeferredOperationKHR,用于 请求延迟 此命令。 -
pInfo
是指向 VkCopyMicromapToMemoryInfoEXT 结构的指针,该结构定义了复制操作。
此命令与 vkCmdCopyMicromapToMemoryEXT 执行相同的任务,但由主机执行。
此命令产生与 vkCmdCopyMicromapToMemoryEXT 相同的结果,但将其结果直接写入主机指针,并在主机而不是设备上执行。输出可能不一定按位完全相同,但它可以被 vkCmdCopyMemoryToMicromapEXT 或 vkCopyMemoryToMicromapEXT 同等使用。
要在主机上查询微型映射大小参数,请调用
// 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 值,指定要查询的属性。 -
dataSize
是pData
指向的缓冲区的大小(以字节为单位)。 -
pData
是指向应用程序分配的缓冲区的指针,结果将写入该缓冲区。 -
stride
是pData
中各个查询结果之间的步幅(以字节为单位)。
此命令与 vkCmdWriteMicromapsPropertiesEXT 执行相同的任务,但由主机执行。
位移微映射
加速结构中的位移微映射包含 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_NV
和 VK_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 |