新资源类型
Direct3D 11 中添加了几个新的资源类型。
读/写缓冲区和纹理
着色器模型 4 资源是只读的。 着色器模型 5 实现一组新的相应的读/写资源:
这些资源需要资源变量才能通过索引) 访问内存 (,因为没有直接访问内存的方法。 可以在公式的左右两侧使用资源变量;如果在右侧使用,则模板类型必须是单个组件, (float、int 或 uint) 。
结构化缓冲区
结构化缓冲区是包含大小相等的元素的缓冲区。 使用具有一个或多个成员类型的结构来定义元素。 下面是一个包含三个成员的结构。
struct MyStruct
{
float4 Color;
float4 Normal;
bool isAwesome;
};
使用此结构声明结构化缓冲区,如下所示:
StructuredBuffer<MyStruct> mySB;
除了索引编制,结构化缓冲区还支持访问单个成员,如下所示:
float4 myColor = mySb[27].Color;
使用以下对象类型访问结构化缓冲区:
- StructuredBuffer 是只读结构化缓冲区。
- RWStructuredBuffer 是一个读/写结构化缓冲区。
允许在 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标志,创建无序访问缓冲区或纹理。
无序访问资源只能绑定到像素着色器和计算着色器。 在执行期间,并行运行的像素着色器或计算着色器具有相同的无序访问资源。
追加和使用缓冲区
追加和使用缓冲区是一种特殊类型的无序资源,支持从缓冲区末尾添加和删除值,类似于堆栈的工作方式。
追加和消耗缓冲区必须是结构化缓冲区:
通过方法使用这些资源,这些资源不使用资源变量。
相关主题