Output-Merger 阶段
输出合并(OM)阶段使用管道状态、像素着色器生成的像素数据、呈现目标的内容和深度/模具缓冲区的内容的组合生成最终呈现的像素颜色。 OM 阶段是确定哪些像素可见(具有深度模具测试)和混合最终像素颜色的最后一步。
Direct3D 9 和 Direct3D 10 之间的差异:
- Direct3D 9 实现 alpha 测试(使用 alpha 测试状态)来控制是否将像素写入输出呈现目标。
- Direct3D 10 及更高版本不实现 alpha 测试(或 alpha 测试状态)。 这可以使用像素着色器或深度/模具功能进行控制。
Depth-Stencil 测试概述
作为纹理资源创建的深度模具缓冲区可以包含深度数据和模具数据。 深度数据用于确定离相机最近的像素,模具数据用于屏蔽可更新的像素。 最终,输出合并阶段使用深度值和模具值数据来确定是否应绘制像素。 下图从概念上展示了深度模具测试的完成方式。
若要配置深度模具测试,请参阅 配置 Depth-Stencil 功能。 深度模具对象封装深度模具状态。 应用程序可以指定深度模具状态,或者 OM 阶段将使用默认值。 如果禁用多重采样,则按像素执行混合作。 如果启用了多重采样,则混合按多重采样进行。
使用深度缓冲区来确定应绘制的像素的过程称为深度缓冲,有时也称为 z 缓冲。
一旦深度值到达输出合并阶段(无论是来自内插还是来自像素着色器),它们始终固定:z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z),具体取决于深度缓冲区的格式/精度,使用浮点规则。 固定后,深度值将相对于现有深度缓冲区值进行比较(使用 DepthFunc)。 如果未绑定深度缓冲区,深度测试始终通过。
如果深度缓冲区格式中没有模具组件,或者没有深度缓冲区绑定,则模具测试始终通过。 否则,功能与 Direct3D 9 保持不变。
一次只能有一个深度/模具缓冲区处于活动状态;任何绑定的资源视图必须与深度/模具视图匹配(大小和尺寸相同)。 这并不意味着资源大小必须匹配,只是视图大小必须匹配。
有关深度模具测试的详细信息,请参阅 教程 14。
混合概述
混合结合了一个或多个像素值来创建最终像素颜色。 下图显示了混合像素数据所涉及的过程。
混合数据工作原理的
从概念上讲,可以将此流程图可视化在输出合并阶段实现两次:第一个流程图混合 RGB 数据,另一个混合 alpha 数据。 若要了解如何使用 API 创建和设置混合状态,请参阅 配置混合功能。
可以为每个呈现目标单独启用固定函数混合。 但是,只有一组混合控件,以便将同一混合应用于所有已启用混合的 RenderTargets。 混合值(包括 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_COLOR、D3D11_BLEND_INV_SRC1_COLOR、D3D11_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 值)执行混合作。 如果启用了多重采样,则对每个多重采样执行混合;否则,对每个像素执行混合。 |
深度偏差 |
在 3D 空间中共同平面的多边形可以通过向每个多边形(或深度偏差)添加一个 z 偏差(或深度偏差)来显示它们,就像它们不是共同平面一样。 |