缓冲区简介

缓冲区资源是一个完全类型化的数据集合,并按元素进行分组。 缓冲区在 顶点缓冲区存储纹理坐标、索引缓冲区中的索引、常量缓冲区中的数据着色器常量数据、位置向量、正常向量或设备状态。

缓冲区元素由 1 到 4 个组件组成。 缓冲区元素可以包括打包的数据值(如R8G8B8A8图面值)、单一 8 位整数或四个 32 位浮点值。

缓冲区作为非结构化资源创建。 由于它是非结构化的,因此缓冲区不能包含任何 mipmap 级别,因此在读取时无法对其进行筛选,并且无法进行多重采样。

缓冲区类型

以下是 Direct3D 11 支持的缓冲区资源类型。

顶点缓冲区

顶点缓冲区包含用于定义几何图形的顶点数据。 顶点数据包括位置坐标、颜色数据、纹理坐标数据、普通数据等。

顶点缓冲区的最简单示例是仅包含位置数据的缓冲区。 可以像下图所示将其可视化。

包含位置数据的顶点缓冲区的图示

通常,顶点缓冲区包含完全指定三维顶点所需的所有数据。 例如,顶点缓冲区包含每顶点位置、普通坐标和纹理坐标。 此数据通常按每个顶点元素集进行组织,如下图所示。

包含位置、法线和纹理数据的顶点缓冲区的图示

此顶点缓冲区包含每个顶点数据;每个顶点存储三个元素(位置、普通和纹理坐标)。 位置和法线通常各使用三个 32 位浮点数,而纹理坐标使用两个 32 位浮点数来指定。

若要从顶点缓冲区访问数据,需要知道访问哪个顶点,以及以下其他缓冲区参数:

  • 偏移量 - 从缓冲区起始位置到第一个顶点数据的字节数。
  • BaseVertexLocation - 从偏移量到相应绘图调用使用的第一个顶点的字节数。

在创建顶点缓冲区之前,需要定义其布局。 创建输入布局对象后,将其绑定到 输入汇编程序 (IA) 阶段

索引缓冲区

索引缓冲区包含顶点缓冲区的整数偏移量,用于更高效地呈现基元。 索引缓冲区包含一系列顺序排列的 16 位或 32 位索引,每个索引用于标识顶点缓冲区中的一个顶点。 可以像下图所示可视化索引缓冲区。

索引缓冲区的插图

索引缓冲区中存储的顺序索引具有以下参数:

  • 偏移量 - 索引缓冲区基址中的字节数。
  • StartIndexLocation - 指定从基地址和偏移量开始的第一个索引缓冲区元素。 起始位置表示要呈现的第一个索引。
  • IndexCount - 要呈现的索引的数量。

索引缓冲区的开始位置 = 索引缓冲区基址 + 偏移量(字节)+ StartIndexLocation * ElementSize(字节);

在此计算中,ElementSize 是每个索引缓冲区元素的大小,即两个或四个字节。

常量缓冲区

使用常量缓冲区,可以有效地向管道提供着色器常量数据。 可以使用常量缓冲区来存储流输出阶段的结果。 从概念上讲,常量缓冲区看起来像单元素顶点缓冲区,如下图所示。

着色器常量缓冲区的插图

每个元素存储一个 1 到 4 个组件常量,该常量由存储的数据的格式决定。

常量缓冲区只能使用单个绑定标志,该标志不能与任何其他绑定标志组合。

若要从着色器读取着色器常量缓冲区,请使用 HLSL 加载函数。 每个着色器阶段最多允许 15 个着色器常量缓冲区;每个缓冲区最多可以容纳 4096 个常量。

顶点和索引缓冲区