流式资源纹理采样功能
流式资源纹理采样功能包括获取有关映射区域的着色器状态反馈,检查正在访问的所有数据是否已在资源中映射,进行固定以帮助着色器避开 Mip 映射流式资源中已知的非映射区域,以及发现为整个纹理筛选器足迹完全映射的最小 LOD。
流式资源纹理采样功能的要求
此处所述的纹理采样功能需要 第 2 层流式处理资源支持。
有关映射区域的着色器状态反馈
读取和/或写入流资源的任何着色器指令都会导致记录状态信息。 此状态在进入 32 位临时寄存器的每个资源访问指令上都公开为可选的额外返回值。 返回值的内容不透明。 也就是说,不允许着色器程序直接读取。 但是,可以使用 CheckAccessFullyMapped 函数提取状态信息。
完全映射的检查
CheckAccessFullyMapped 函数解释从内存访问返回的状态,并指示是否在资源中映射了正在访问的所有数据。 如果映射了数据,则 CheckAccessFullyMapped 返回 true (0xFFFFFFFF),如果数据未映射,则返回 false (0x00000000)。
在筛选操作期间,给定纹素的权重最终为 0.0。 例如,具有直接落在纹素中心的纹理坐标的线性样本:3 个其他纹素(它们因硬件而异)对筛选器的贡献,但重量为 0。 这 0 个权重纹素根本不会导致筛选结果,因此,如果它们碰巧落在 NULL 磁贴上,则它们不会算作未映射的访问。 请注意,相同的保证适用于包含多个 mip 级别的纹理筛选器;如果某个 mipmap 上的纹素未映射,但这些纹素的权重为 0,则这些纹素不算为未映射的访问。
从少于 4 个组件(如 DXGI_FORMAT_R8_UNORM)的格式采样时,任何属于 NULL 磁贴的纹素都会导致报告 NULL 映射的访问,而不管着色器实际在结果中查看哪些组件。 例如,从 R8_UNORM 中读取并使用 .gba/.yzw 屏蔽着色器中的读取结果并不需要读取纹理。 但是,如果纹素地址是 NULL 映射磁贴,则该操作仍算作 NULL 映射访问。
着色器可以检查状态,并在失败时执行任何所需的操作过程。 例如,一个操作过程可以记录“错过”(例如通过 UAV 写入)和/或发出另一个固定到已知映射的粗糙 LOD 的读取。 应用程序可能还需要跟踪成功的访问,以便了解已访问的映射磁贴集的哪个部分。
日志记录的一个复杂因素是,没有用于报告已访问的确切磁贴集的机制。 应用程序可以根据知道用于访问的坐标以及使用 LOD 指令进行保守的猜测;例如, tex2Dlod) 返回硬件 LOD 计算。
另一个复杂性是,大量的访问将使用相同的磁贴,因此将发生大量冗余日志记录,并可能争用内存。 如果可以向硬件提供不费力地报告磁贴访问的选项(如果以前在其他地方报告这些访问)可能会很方便。 也许此类跟踪的状态可以从 API 重置(可能位于帧边界)。
每样本 MinLOD 固定
为了帮助着色器避免被误用流式处理资源中的区域,已知是非映射的,大多数涉及使用采样器(筛选)的着色器指令都有一种模式,允许着色器将额外的 float32 MinLOD 固定参数传递给纹理样本。 此值位于视图的 mipmap 数字空间中,而不是基础资源。
硬件max(fShaderMinLODClamp,fComputedLOD)
在 LOD 计算中执行相同的位置,其中每个资源的 MinLOD 固定发生,这也是 max()。
如果应用每个样本 LOD 固定和采样器中定义的任何其他 LOD 固定的结果为空集,则结果与每个资源 minLOD 固定项相同:0 表示表面格式的组件,缺失组件的默认值为 0。
LOD 指令(例如 ,tex2Dlod),该指令早于此处所述的每样本 minLOD 夹,返回固定和未固定的 LOD。 从此 LOD 指令返回的固定 LOD 反映所有固定(包括每个资源夹),但不包括每个样本夹子。 不管怎样,着色器都可以控制每个样本夹子并知道,因此着色器作者可以根据需要手动将该固定应用于 LOD 指令的返回值。
最小值/最大值减少筛选
应用程序可以选择管理自己的数据结构,以通知他们流式处理资源的映射的外观。 例如,一个图面包含一个纹素,用于保存流式处理资源中每个磁贴的信息。 人们可能会存储映射到给定磁贴位置的第一个 LOD。 通过仔细采样此数据结构的方式与流式处理资源要采样的方式类似,可能会发现为整个纹理筛选器占用空间完全映射的最小 LOD 是什么。 为了帮助简化此过程,Direct3D 11.2 引入了新的常规用途采样器模式(最小/最大筛选)。
LOD 跟踪的最小/最大筛选实用工具可能适用于其他目的,例如,深度图面的筛选。
最小/最大减少筛选是采样器上的一种模式,用于提取普通纹理筛选器将提取的同一组纹素。 但是,它不混合值以生成答案,而是按组件返回提取的纹素的 min(或 max(例如,所有 R 值的最小值,与所有 G 值的最小值等)。
最小/最大运算遵循 Direct3D 算术精度规则。 比较顺序并不重要。
在不是最小值/最大值的筛选器操作期间,给定纹素的权重最终为 0.0。 例如,具有直接落在纹素中心的纹理坐标的线性样本;在这种情况下,3 个其他纹素(它们可能因硬件而异)对筛选器有所影响,但重量为 0。 对于非最小值/最大筛选器上为 0 权重的这些纹素,如果筛选器为最小值/最大值,则这些纹素仍不会导致结果(权重不影响最小值/最大筛选操作)。
此功能的支持取决于 对流式处理资源的第 2 层支持。
相关主题