FidelityFX Classifier 1.3
AMD FidelityFX Classifier 包含针对特定工作负载优化的专用瓦片分类器。
- 阴影分类器 - 旨在对需要光线追踪来确定阴影信息的像素进行分类。
- 反射分类器 - 旨在根据表面粗糙度对混合像素和硬件光线追踪像素进行分类。
AMD FidelityFX 阴影分类器
引言
FidelityFX Shadow Classifier 旨在帮助加速光线追踪阴影的生成。它通过分析场景并将屏幕划分为 8x4 的瓦片来工作,这些瓦片代表了像素级别的光线追踪需求。返回的瓦片列表表示所有包含至少一个需要应用光线追踪的像素的瓦片。
着色语言要求
瓦片位置使用显式 fp16 类型进行编码。
HLSL GLSL CS_6_2
输入
本节介绍 FidelityFX Shadow Classifier 的输入。
| 输入名称 | 类型 | 说明 |
|---|---|---|
| depth | 2D 纹理 | 当前帧的深度缓冲区。 |
| normal | 2D 纹理 | 当前帧的法线缓冲区。 |
| shadowMaps | 2D 纹理数组 | 当前帧的阴影级联。 |
| workQueue | Buffer | 分类器返回的瓦片列表。 |
| workQueueCount | Buffer | 包含此帧返回的瓦片数量的原子计数器。 |
| rayHitMask | 2D 纹理 | 阴影贴图阻挡物搜索的结果。 |
此外,还可以通过分类模式初始化分类器上下文。提供的两个选项是:
ClassifyByNormals- 仅根据法线纹理对瓦片进行分类。ClassifyByCascades- 使用法线纹理和阴影贴图级联对瓦片进行分类。
技术
下图显示了瓦片分类器所需的输入资源以及如何在后续的“RayTrace Shadows”通道中使用其结果。有关使用此结构的特效的更多信息,请参阅 混合阴影。
数据流

分类器输入
-
深度缓冲区
- 用于重建世界位置。
- 用于拒绝天空像素。
-
法线缓冲区
- 用于拒绝不朝向太阳的像素。
- 用于拒绝不朝向太阳的像素。
-
级联阴影贴图
- 用于拒绝不需要光线追踪的像素。
- 用于拒绝不需要光线追踪的像素。
分类器输出
-
瓦片列表
- 需要光线追踪的所有 8x4 瓦片的列表。
- 每个瓦片都有一个掩码,指示瓦片中的哪些像素需要光线追踪。
- 每个瓦片还有最小和最大光线长度。
-
光线命中掩码
- 每个 8x4 瓦片的 `uint` 掩码。
- 预先加载了级联阴影贴图阻挡物搜索的结果。
阻挡物搜索
在使用阴影贴图级联对瓦片进行分类时,一个关键步骤是检查当前像素与阴影近平面之间是否存在任何阻挡物。为此,我们使用光空间深度将太阳尺寸缩放到阴影贴图的近平面,然后使用泊松圆盘分布来均匀采样搜索区域。

像素分类
在此阶段,我们使用阴影贴图级联的最大和最小深度值来拒绝像素。
![]()
![]()
光线区间
也可以使用阴影级联贴图计算光线区间。此信息可以存储在瓦片中,之后可在光线追踪通道中使用。

光线追踪通道
在瓦片分类通道之后,可以使用生成的 rayHitMask 和瓦片列表来启动光线追踪内核。有关使用此结构的特效的示例,请参阅 混合阴影示例。以下是此类通道的预期输入和输出:
光线追踪输入
-
深度缓冲区
- 用于重建世界位置。
- 用于重建世界位置。
-
法线缓冲区
- 用于沿像素法线偏移光线。
- 用于沿像素法线偏移光线。
-
瓦片列表
- 用于决定从哪个像素发射光线。
- 用于决定从哪个像素发射光线。
光线追踪输出
-
光线命中掩码
- 每个 8x4 瓦片的 `uint` 掩码。
- 每个 8x4 瓦片的 `uint` 掩码。
-
与预填充掩码合并的光线命中结果。
此通道使用 FidelityFX Shadow Classifier 生成的瓦片数据来设置每个工作组,使其能够处理 8x4 瓦片,这完美地映射到 32 的线程组大小。此通道还利用蓝色噪声纹理,该纹理每帧采样一次以创建新的光线射入场景。如果使用深度区间,则可以反转光线,以便从太阳追溯到表面,从而更快地遍历加速结构。
使用的优化
-
Wave 活动掩码
- 使用 `uint` 存储阻挡物搜索结果可以将存储结果的内存量减少 32:1。
- 使用 `uint` 存储阻挡物搜索结果可以将存储结果的内存量减少 32:1。
-
光线命中掩码
- 每像素一根光线,命中结果缓冲区内存大小可减少 32:1。
- 每像素一根光线,命中结果缓冲区内存大小可减少 32:1。
-
用图像加载替换点采样
- 在 RDNA 上,加载操作可以更快地将数据从缓存移动到着色器核心。
- 在 RDNA 上,加载操作可以更快地将数据从缓存移动到着色器核心。
AMD FidelityFX 反射分类器
引言
FidelityFX Reflection Classifier 是一种基于反馈的瓦片分类器,专为光线追踪反射而设计。它使用 8x8 瓦片通过反馈统计来检测光线追踪需求。使用安全带区域可避免在快速移动场景中出现闪烁。
着色语言要求
HLSL GLSL CS_6_0
输入
本节介绍 FidelityFX Reflection Classifier 的输入。
| 输入名称 | 类型 | 说明 |
|---|---|---|
| depth | Texture2D | 当前帧的深度缓冲区 |
| motionVectors | Texture2D | 当前帧的运动矢量 |
| normal | Texture2D | 当前帧的法线 |
| materialParameters | Texture2D | 当前帧的 `aoRoughnessMetallic` 缓冲区 |
| environmentMap | Texture2D | 当屏幕空间数据不足时用于回退的环境贴图 |
| radiance | Texture2D | 场景辐射度 |
| varianceHistory | Texture2D | 方差历史 |
| hitCounter | Texture2D | 乒乓反馈计数器 |
| hitCounterHistory | Texture2D | 上一个乒乓反馈计数器 |
| extractedRoughness | Texture2D | 提取的粗糙度 |
| rayList | Buffer | 用于混合反射追踪的光线列表(使用 FidelityFX SSSR) |
| rayListHW | Buffer | 用于全硬件光线追踪的光线列表 |
| denoiserTileList | Buffer | 需要降噪的瓦片 |
| constants | 常量缓冲区 | 一个包含相机位置、一些变换矩阵和其他杂项设置信息的常量缓冲区 |
技术
FidelityFX Reflection Classifier 根据上一帧的统计数据检测 8x8 瓦片的光线追踪类别。
有三种瓦片类别:全光线追踪、棋盘格混合和全混合。
对于全光线追踪,使用 0 和 1 的随机投掷来允许将这些瓦片转换为纯混合瓦片。
当屏幕空间相交成功时,命中计数器会增加,否则未命中计数器会增加。命中和未命中计数器合并为反馈计数器,并使用运动矢量进行重投影。
反馈计数器为每 8x8 像素瓦片使用一个 FfxUint32 值,表示 2 帧统计数据的 4 个 8 位计数器。