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 线程上创建命令列表,这样就可以并行遍历场景数据库或在多个线程上进行物理处理。 这会释放main呈现线程,以便将命令缓冲区调度到硬件。

有关其他信息 ,请参阅 MultiThreading

分割

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

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

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

功能的完整列表

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

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

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

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

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

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

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

    • 子 例 程

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

    • 几何着色器 (请参阅 几何着色器功能)

      • 实例化 - 允许几何着色器输出最多 1024 个顶点,或实例和顶点的任意组合,最大为 1024 (最多 32 个实例,每个) 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)

    • 带 denorms 的双精度
    • 计数位设置指令
    • 查找第一个位集指令
    • 携带/溢出处理
    • FFT 的位反转指令
    • 条件交换内部函数
    • 缓冲区上的可塑性
    • 降精度倒数
    • 着色器转换说明 - 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 中的新增功能