Direct3D 11 功能

编程指南包含有关如何使用 Direct3D 11 可编程管道为游戏和科学和桌面应用程序创建实时 3D 图形的信息。

计算着色器

计算着色器是一种可编程着色器,专为常规用途数据并行处理而设计。 换句话说,计算着色器允许 GPU 用作常规用途并行处理器。 计算着色器类似于其他可编程管道着色器(如顶点、像素、几何图形),以访问输入和输出的方式。 计算着色器技术也称为 DirectCompute 技术。 计算着色器集成到 Direct3D 中,可通过 Direct3D 设备访问。 它可以直接使用 Direct3D 设备与图形着色器共享内存资源。 但是,它未直接连接到其他着色器阶段。

当 API(及其关联的软件堆栈)和 CPU 之间的转换成本消耗过多开销时,计算着色器专为大规模市场应用程序设计,这些应用程序以交互速率执行计算。

计算着色器有自己的状态集。 计算着色器不一定具有强制的 1-1 映射到输入记录(如顶点着色器)或输出记录(如像素着色器)。 支持图形着色器的某些功能,但其他功能已被删除,以便添加新的计算着色器特定的功能。

为了支持计算着色器特定的功能,现在提供了多个新的资源类型,例如读/写缓冲区、纹理和结构化缓冲区。

有关其他信息,请参阅 计算着色器概述

动态着色器链接

呈现系统在管理着色器时必须处理重大复杂性,同时提供优化着色器代码的机会。 这已成为一个更大的挑战,因为着色器必须在呈现的场景中支持各种不同材料,跨各种硬件配置。 为了应对这一挑战,着色器开发人员通常采用两种常规方法之一。 它们已创建功能齐全的大型常规用途着色器,这些着色器可供各种场景项使用,这些着色器可权衡一些性能以实现灵活性,或为每个几何图形流、材料类型或光类型组合创建单独的着色器。

这些大型通用着色器通过重新编译具有不同预处理器定义的同一着色器来处理此挑战,而后一种方法使用暴力开发人员能力来实现相同的结果。 着色器排列爆炸通常是一个问题,开发人员现在必须在其游戏和资产管道中管理数千个不同的着色器排列。

Direct3D 11 和着色器模型 5 引入了面向对象的语言构造,并提供着色器链接的运行时支持,以帮助开发人员编程着色器。

有关其他信息,请参阅 动态链接

多线程处理

由于场景图遍历、对象排序和物理模拟等成本高昂的活动,许多图形应用程序都受 CPU 限制。 由于多核系统越来越可用,Direct3D 11 改进了其多线程支持,以实现多个 CPU 线程和 D3D11 图形 API 之间的高效交互。

Direct3D 11 使以下功能支持多线程处理:

  • 并发对象现在在单独的线程中创建 - 创建对象自由线程的入口点函数使许多线程能够同时创建对象。 例如,应用程序现在可以编译着色器或在一个线程上加载纹理,同时在另一个线程上呈现。
  • 可以在多个线程上创建命令列表 — 命令列表是一系列记录的图形命令。 使用 Direct3D 11,可以在多个 CPU 线程上创建命令列表,从而在多个线程上并行遍历场景数据库或物理处理。 这会释放主呈现线程以将命令缓冲区调度到硬件。

有关其他信息,请参阅 多线程

棋盘形布置

分割可用于呈现具有不同细节级别的单个模型。 此方法生成一个更几何准确的模型,该模型取决于场景所需的详细信息级别。 在细节级别允许较低几何图形模型的场景中使用细化,从而减少呈现期间消耗的内存带宽需求。

在 Direct3D 中,在 GPU 上实现分割,以从粗糙(不太详细)的输入补丁中计算更平滑的曲线图面。 每个(四角形或三角形)修补面被细分为较小的三角人脸,以更好地近似所需的表面。

有关在图形管道中实现分割的信息,请参阅 分割概述

功能的完整列表

这是 Direct3D 11 中功能的完整列表。

  • 可以通过在创建设备时指定 功能级别,在 下层硬件 上运行 Direct3D 11。

  • 可以使用以下着色器类型执行分割(请参阅 细化概述):

    • 外壳着色器
    • 域着色器
  • Direct3D 11 支持多线程处理(请参阅 多线程

    • 多线程资源/着色器/对象创建
    • 多线程显示列表创建
  • Direct3D 11 使用以下功能扩展着色器(请参阅 着色器模型 5

    • 可寻址资源 - 纹理、常量缓冲区和采样器

    • 其他资源类型,如读/写缓冲区和纹理(请参阅 新资源类型)。

    • 子 例 程

    • 计算着色器(请参阅 计算着色器概述) - 一种着色器,通过将多个软件线程或线程组之间的问题空间除以在着色器寄存器之间共享数据,以显著减少输入着色器所需的数据量,从而加快计算速度。 计算着色器可以显著提高的算法包括后期处理、动画、物理和人工智能。

    • 几何着色器(请参阅 几何着色器特征

      • 实例化 - 允许几何着色器最多输出 1024 个顶点,或者最多 1024 个实例和顶点的任意组合(每个顶点最多 32 个实例)。
    • 像素着色器

      • 作为 PS 输入的覆盖范围

      • 输入的可编程内插 - 像素着色器可以在多重采样网格的任意位置评估像素内的属性

      • 属性的质心采样必须遵循以下规则:

        • 如果覆盖了基元中的所有样本,则无论样本模式是否在像素中心具有样本位置,该属性都会在像素中心进行评估。

        • 否则,该属性将在第一个包含的示例(即所有示例索引中具有最低索引的示例)求值。 在这种情况下,将逻辑 AND作应用到覆盖范围和样本掩码光栅器状态后,将确定样本覆盖率。

        • 如果未涵盖任何样本(例如,在基元边界下执行的帮助程序像素以填充 2x2 像素戳),则属性会通过以下方式之一进行评估:

          • 如果样本掩码光栅器状态是像素中的样本子集,则样本掩码光栅器状态覆盖的第一个样本是评估点。
          • 否则,在完整的采样掩码条件下,像素中心是评估点。
  • Direct3D 11 扩展纹理(请参阅 纹理概述),并具有以下功能

    • Gather4

      • 支持多组件纹理 - 指定要从中加载的通道
      • 对可编程偏移的支持
      • 用于限制 WDDM 预加载的纹理固定
    • 16K 纹理限制

    • 在纹理筛选上需要 8 位子纹素和子 mip 精度

    • 新的纹理压缩格式(1 个新的 LDR 格式和 1 个新的 HDR 格式)

  • Direct3D 11 支持保守的 oDepth - 此算法允许像素着色器将像素着色器的每像素深度值与光栅器中的深度值进行比较。 结果可实现早期深度剔除作,同时保持从像素着色器输出 oDepth 的能力。

  • Direct3D 11 支持大型内存

    • 允许 > 4GB 的资源
    • 保留资源 32 位的索引,但资源更大
  • Direct3D 11 支持流输出改进

    • 可寻址流输出
    • 将流输出计数增加到 4
    • 将所有流输出缓冲区更改为多元素
  • Direct3D 11 支持着色器模型 5(请参阅 着色器模型 5

    • 带非序的双打
    • 计数位集指令
    • 查找第一位集指令
    • 携带/溢出处理
    • FFT 的位反转指令
    • 条件交换内部函数
    • 缓冲区上的树脂fo
    • 精度降低的倒数
    • 着色器转换说明 - fp16 到 fp32,反之亦然
    • 结构化缓冲区,它是包含结构化元素的新缓冲区类型。
  • Direct3D 11 支持只读深度或模具视图

    • 禁用对只读部件的写入,允许将纹理用作输入和深度剔除
  • Direct3D 11 支持间接绘图 - Direct3D 10 实现 DrawAuto,它采用内容(由 GPU 生成)并呈现它(在 GPU 上)。 Direct3D 11 通用化 DrawAuto,以便使用 DrawInstanced 和 DrawIndexedInstanced 的计算着色器调用它。

  • Direct3D 11 支持其他功能

    • 浮点视区
    • 按资源 mipmap 固定
    • 深度偏差 - 此算法使用光栅器状态更新深度偏差的行为。 结果消除了计算偏差可以是 NaN 的方案。
    • 资源限制 - 资源索引仍需要 <= 32 位,但资源可能大于 4 GB。
    • 光栅器精度
    • MSAA 要求
    • 计数器减少
    • 已删除 1 位格式和文本筛选器

在以前的版本中添加的功能

有关在以前版本中添加的功能的列表,请参阅以下主题:

Direct3D 11 中的新增功能