输出合并器阶段

输出合并 (OM) 阶段使用管道状态、像素着色器生成的像素数据、呈现目标的内容以及深度/模具缓冲区的内容的组合生成最终呈现的像素颜色。 OM 阶段是确定哪些像素可见的最后一步, (深度模具测试) 和混合最终像素颜色。

Direct3D 9 与 Direct3D 10 之间的差异:

  • Direct3D 9 使用 alpha 测试状态) 实现 alpha 测试 (控制是否将像素写入输出呈现目标。
  • Direct3D 10 及更高版本不实现 alpha 测试 (或 alpha 测试状态) 。 这可以使用像素着色器或深度/模具功能进行控制。

Depth-Stencil测试概述

作为纹理资源创建的深度模板缓冲区可同时包含深度数据和模板数据。 深度数据用于确定最靠近相机的像素,模板数据用于掩盖可以更新的像素。 最终,深度值和模板值数据将被输出合并阶段用来确定是否应绘制某个像素。 下图显示了在概念上如何完成深度模板测试。

深度模板测试的工作原理的图示

若要配置深度模板测试,请参阅配置深度模板功能。 深度模板对象将封装深度模板状态。 应用程序可指定深度模板状态,否则 OM 阶段将使用默认值。 如果已禁用多重采样,则为每个像素执行一次混合运算。 如果已启用多重采样,则在每次多重采样时执行一次混合。

使用深度缓冲区确定应绘制的像素的过程称为深度缓冲,有时也称为 z 缓冲。

当深度值到达输出合并阶段(无论来自内插还是来自像素着色器),将使用浮点规则并根据深度缓冲区的格式/精度始终固定它们:z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z))。 在固定后,深度值将与现有深度缓冲区值进行比较(使用 DepthFunc)。 如果没有绑定深度缓冲区,深度测试将总是通过。

如果没有采用深度缓冲区格式的模板组件,或没有绑定深度缓冲区,模板测试将总是通过。 否则,功能与 Direct3D 9 不一样。

一次只能有一个深度/模板缓冲区可处于活动状态;任何绑定的资源视图必须与(相同大小和尺寸的)深度/模板视图匹配。 这并不意味着资源大小必须匹配,而只是意味着视图大小必须匹配。

有关深度模具测试的详细信息,请参阅 教程 14

混合概述

混合是指将一个或多个像素值组合起来以创建最终的像素颜色。 下图显示了混合像素数据涉及的过程。

混合数据的工作原理的图示

从概念上讲,可以将此流程图可视化在输出合并阶段实现两次:第一个图表混合 RGB 数据,而第二个混合 alpha 数据。 若要了解如何使用 API 创建和设置混合状态,请参阅配置混合功能

可为每个呈现目标单独启用固定函数混合。 但是,只存在一组混合控件,这是为了在启用混合后让同一混合应用于所有 RenderTarget。 在混合之前,混合值(包括 BlendFactor)始终固定到呈现目标格式的范围。 根据呈现目标类型,固定对每个呈现目标执行一次。 唯一的例外情况是 float16、float11 或 float10 格式,为了让针对这些格式的混合运算可在至少具有与输出格式相等的精度/范围的情况下完成,没有对这些格式进行固定。 在所有情况下都会传播 NaN 和有符号零(包括 0.0 混合权重)。

当你使用 sRGB 呈现目标时,运行时在执行混合之前会将呈现目标颜色转换到线性空间中。 运行时在将最终混合的值保存回呈现目标之前会将该值转换回 sRGB 空间中。

Direct3D 9 与 Direct3D 10 之间的差异:

  • 在 Direct3D 9 中,可以为每个呈现目标单独启用固定函数混合。
  • 在 Direct3D 10 及更高版本中,有一个混合状态说明;因此,可以为所有呈现目标设置一个混合值。

Dual-Source颜色混合

此功能使输出合并阶段能够同时使用像素着色器输出 (o0 和 o1) 作为对槽 0 处的单个呈现目标的混合操作的输入。 有效的混合运算包括:add、subtract 和 revsubtract。 SrcBlend、DestBlend、SrcBlendAlpha 或 DestBlendAlpha 的有效混合选项包括:D3D11_BLEND_SRC1_COLORD3D11_BLEND_INV_SRC1_COLORD3D11_BLEND_SRC1_ALPHA、D3D11_BLEND_INV_SRC1_ALPHA。 混合方程和输出写入掩码指定了像素着色器将输出的组件。 额外组件将被忽略。

向其他像素着色器输出(o2、o3 等)的写入未定义;如果呈现目标未绑定到槽 0,你就无法写入到呈现目标。 在双源颜色混合期间写入 oDepth 很有效。

有关示例,请参阅 混合像素着色器输出

多个 RenderTargets 概述

像素着色器可用于呈现至少 8 个单独的呈现目标,所有这些目标都必须属于同一类型(缓冲区、Texture1D、Texture1DArray 等)。 此外,所有呈现目标在所有尺寸上都必须都具有相同的大小(宽度、高度、深度、数组大小、样本计数)。 每个呈现器目标都可能有不同的数据格式。

你可以使用呈现目标槽(最多 8 个)的任意组合。 但是,资源视图不能同时绑定到多个呈现目标槽。 只要资源未同时使用,视图就可以重复使用。

Output-Write掩码概述

使用输出写入掩码可控制(对每个组件)可写入到呈现目标的数据。

示例掩码概述

采样掩码是 32 位多重采样覆盖掩码,用于确定哪些样本在活动呈现目标中获得更新。 一次只允许有一个采样掩码。 采样掩码中的位到资源中的样本的映射由用户定义。 对于 n 采样呈现,将使用采样掩码的前 n 位(从 LSB 起,32 位是最大位数)。

在本节中

主题 说明
配置Depth-Stencil功能
本节介绍了设置深度模板缓冲区的步骤以及输出合并阶段的深度模板状态。
配置混合功能
在将输出值写入呈现目标之前,对每个像素着色器输出 (RGBA 值) 执行混合操作。 如果启用了多重采样,则对每个多重采样执行混合;否则,将在每个像素上执行混合。
深度偏差
通过将 z 偏置 (或深度偏差) 添加到 3D 空间中的共面多边形,可以使其看起来像不是共面。

图形管道

管道阶段 (Direct3D 10)