DirectX之DirectCompute的计算着色器(2)

 

                                                                                  1. 新资源类型

 

 

Direct3D 11中增加了几种新的资源类型。

  1. 1.1 读/写缓冲区和纹理
  2. 1.2 结构化的缓冲区
  3. 1.3 字节地址缓冲区
  4. 1.4 无序访问缓冲区或文本
      1. 1.4.1 追加和消耗缓冲区
  5. 相关主题

 

1.1 读写缓冲区和纹理

着色器模型4的资源是只读的。着色器模型5实现了一个新的相应的读/写资源集:

  1. RWBuffer
  2. RWTexture1DRWTexture1DArray
  3. RWTexture2DRWTexture2DArray
  4. RWTexture3D

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

 

1.2 结构化的缓冲区

规整缓冲区是包含相同大小的元素的缓冲区。使用具有一个或多个成员类型的结构来定义元素。这是一个有三个成员的结构。

struct MyStruct

{

    float4 Color;

    float4 Normal;

    bool isAwesome;

};

 

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

StructuredBuffer<MyStruct> mySB;

 

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

float4 myColor = mySb[27].Color;

 

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

 

原子函数允许对RWStructuredBuffer中的intuint元素执行联锁操作。

 

1.3 字节地址缓冲区

字节地址缓冲区是一个缓冲区,其内容可以通过字节偏移量来寻址。通常,缓冲区的内容在每个元素(S)上都使用“stride步幅)”对每个元素建立索引,并且由S*N给出的元素数(N) 字节地址缓冲区,也可以称为原始缓冲区,使用从缓冲区的开头的字节值偏移量来访问数据。字节值必须是4的倍数,所以它是DWORD对齐的。如果提供了任何其他值,则行为是未定义的。

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

 

1.4 无序访问缓冲区或纹理

一个无序访问资源(包括缓冲区、纹理和纹理数组——没有多重采样/抗锯齿),允许从多个线程进行临时的无序读写访问。这意味着这个资源类型可以由多个线程同时读写,而不会通过使用原子函数原子函数产生内存冲突。

要创建无序的访问缓冲区或纹理,需通过通过调用类似ID3D11Device::CreateBuffer 或ID3D11Device::CreateTexture2D 这样的函数,并且D3D11_BIND_FLAG 枚举中传入D3D11_BIND_UNORDERED_ACCESS标志

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

 

1.4.1 追加和消耗缓冲区

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

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

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

 

相关主题

计算着色器概述

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值