新资源类型

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) ,元素编号 (N) ,由 S*N 给定。 字节地址缓冲区(也可以称为原始缓冲区)使用缓冲区开头的字节值偏移量来访问数据。 字节值必须是 4 的倍数,以便 DWORD 对齐。 如果提供任何其他值,则行为未定义。

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

无序访问缓冲区或纹理

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

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

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

追加和使用缓冲区

追加和使用缓冲区是一种特殊类型的无序资源,支持从缓冲区末尾添加和删除值,类似于堆栈的工作方式。

追加和消耗缓冲区必须是结构化缓冲区:

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

计算着色器概述