新资源类型

Direct3D 11 中添加了多个新的资源类型。

读取/写入缓冲区和纹理

着色器模型 4 资源是只读的。 着色器模型 5 实现一组新的读/写资源:

这些资源需要资源变量来访问内存(通过索引),因为没有直接访问内存的方法。 资源变量可在公式的左侧和右侧使用;如果在右侧使用,则模板类型必须是单个组件(float、int 或 uint)。

结构化缓冲区

结构化缓冲区是包含大小相等的元素的缓冲区。 使用具有一个或多个成员类型的结构来定义元素。 下面是一个包含三个成员的结构。

struct MyStruct
{
    float4 Color;
    float4 Normal;
    bool isAwesome;
};

使用此结构声明如下所示的结构化缓冲区:

StructuredBuffer<MyStruct> mySB;

除了索引编制以外,结构化缓冲区还支持访问如下所示的单个成员:

float4 myColor = mySb[27].Color;

使用以下对象类型访问结构化缓冲区:

原子函数 允许在 RWStructuredBuffer中的 int 和 uint 元素上实现互锁作。

字节地址缓冲区

字节地址缓冲区是一个缓冲区,其内容可通过字节偏移量寻址。 通常,缓冲区 的内容使用每个元素(S)的步幅和 S*N 提供的元素编号(N)为每个元素编制索引。 也可以称为原始缓冲区的字节地址缓冲区使用缓冲区开头的字节值偏移来访问数据。 字节值必须是四个的倍数,以便 DWORD 对齐。 如果提供了任何其他值,则行为是未定义的。

着色器模型 5 引入了用于访问 只读字节地址缓冲区 以及 读写字节地址缓冲区的对象。 字节地址缓冲区的内容设计为 32 位无符号整数;如果缓冲区中的值不是真正的无符号整数,请使用函数(如 asfloat)读取它。

无序访问缓冲区或纹理

无序访问资源(包括缓冲区、纹理和纹理数组-无需多重采样),允许从多个线程进行临时无序读/写访问。 这意味着,此资源类型可由多个线程同时读取/写入,而无需通过使用 Atomic Functions生成内存冲突。

通过调用 ID3D11Device::CreateBufferID3D11Device::CreateTexture2D 等函数并从 D3D11_BIND_FLAG 枚举传入 D3D11_BIND_UNORDERED_ACCESS 标志来创建无序访问缓冲区或纹理。

无序访问资源只能绑定到像素着色器和计算着色器。 在执行期间,并行运行的像素着色器或计算着色器具有相同的无序访问资源。

追加和使用缓冲区

追加和消耗缓冲区是一种特殊的非排序资源类型,它支持在缓冲区末尾添加和删除值,类似于堆栈的工作方式。

追加和使用缓冲区必须是结构化缓冲区:

通过这些资源的方法使用这些资源,这些资源不使用资源变量。

计算着色器概述