配置深度模具功能

本节介绍了设置深度模板缓冲区的步骤以及输出合并阶段的深度模板状态。

了解如何使用深度模具缓冲区和相应的深度模具状态后,请参阅 高级模具技术

创建深度模具状态

深度模具状态告知输出合并阶段如何执行 深度模具测试。 深度模具测试确定是否应绘制给定像素。

将深度模具数据绑定到 OM 阶段

绑定深度模具状态。

使用视图绑定深度模具资源。

呈现目标必须是同一类型的资源。 如果使用多重采样抗锯齿,则所有绑定的呈现目标和深度缓冲区必须具有相同的样本计数。

当缓冲区用作呈现目标时,不支持深度模具测试和多个呈现目标。

  • 可以同时绑定多达 8 个呈现器目标。
  • 所有呈现器目标在所有维度上的尺寸必须相同(宽度和高度,3D 深度或 *Array 类型的数组大小)。
  • 每个呈现器目标都可能有不同的数据格式。
  • 写入掩码控制将数据写入到呈现目标的数据。 输出写入掩码控制在每呈现器目标、每个组件级别上写入到呈现目标的数据。

高级模具技术

深度模具缓冲区的模具部分可用于创建呈现效果,如合成、贴贴和大纲。

复合

你的应用程序可以使用模具缓冲区将 2D 或 3D 图像合成到 3D 场景中。 模具缓冲区中的掩码用于遮挡渲染目标图面的区域。 然后,可以将已存储 2D 信息(如文本或位图)写入遮挡区域。 或者,你的应用程序也可以将额外的 3D 基元渲染到渲染目标图面的已屏蔽模具区域。 它甚至可以渲染整个场景。

游戏通常会合成多个 3D 场景。 例如,赛车游戏通常会显示后视镜。 镜中呈现驾驶员身后的 3D 场景视图。 它本质上是与驾驶员前方视图合成的第二个 3D 场景。

贴纸

Direct3D 应用程序使用贴纸来控制将特定基元图像中的哪些像素绘制到渲染目标图面。 应用程序将贴纸用于基元图像以使共面多边形正确渲染。

例如,在道路上应用轮胎压痕和黄线时,标记应显示直接在路面上显示。 但是,标记和道路的 z 值完全相同。 因此,深度缓冲区可能无法明确分离两者。 后部基元中的部分像素可能会渲染到前部基元上,反之亦然。 最后生成的图像看起来每一帧之间闪烁微光。 此效果称为 z-fighting 或 flimmering。

若要解决此问题,可使用模具屏蔽后部基元上显示贴纸的部分。 关闭 z 缓冲,并将前部基元的图像渲染至渲染目标曲面的已屏蔽区域。

多个纹理混合可用于解决此问题。

轮廓和剪影

你可以使用模具缓冲区生成更抽象的效果,例如轮廓与剪影。

如果应用程序执行两个呈现传递 - 一个生成模具掩码,第二个用于将模具掩码应用于图像,但在第二次传递时基元略小,则生成的图像将仅包含基元的轮廓。 然后,应用程序可以使用纯色填充图像的模具屏蔽区域,使基元呈现浮雕般的外观。

如果模具掩码与你正在渲染的基元的大小和形状相同,则在生成的图像中,基元应在的位置有一个洞。 然后,应用程序可以用黑色填充这个洞,以生成基元剪影。

双面模具

阴影卷用于在模具缓冲区中绘制阴影。 应用程序通过遮挡几何图形计算阴影卷大小,方法是计算剪影边缘并将它们从光线中挤压到一组 3D 卷中。 然后,这些卷将两次渲染到模具缓冲区中。

第一次渲染绘制前向多边形,并增加模具缓冲区值。 第二次渲染绘制阴影卷的后向多边形,并减少模具缓冲区值。

通常,所有增加和减少值会相互抵消。但是,由于阴影卷已被渲染,使用常规几何图形渲染的场景会导致部分像素无法通过 z 缓冲测试。 留在模具缓冲区的值域阴影中像素相对应。 使用这些保留的模具缓冲区内容作为掩码,以在场景中 alpha 混合大面积、全环绕的黑色间隙。 将模具缓冲区作为掩码,结果是将位于阴影处的像素变暗。

这意味着每个光源的阴影几何图形将绘制两次,因此为 GPU 的顶点吞吐量带来了压力。 双面模具功能旨在缓解此问题。 这种方法使用两组模具状态(如下文所列),一组用于前向三角形,另一组用于后向三角形。 这样,每个阴影卷每个光源只需绘制一次。

将深度模具缓冲区读作纹理

着色器可以读取非活动深度模具缓冲区作为纹理。 将深度模具缓冲区读取为纹理以两个通道呈现的应用程序,第一次将写入深度模具缓冲区,第二次传递从缓冲区读取数据。 这样,着色器就可以将以前写入缓冲区的深度或模具值与当前呈现的像素的值进行比较。 比较结果可用于在粒子系统中创建阴影映射或软粒子等效果。

输出合并 (OM) 阶段

图形管道

输出合并阶段