计算着色器完成后如何使用数据?

How to use data once the compute-shader is done?

我有一个这种格式的输出缓冲区:

D3D11_BUFFER_DESC rgbaGPUBuffer;

rgbaGPUBuffer.ByteWidth             = width * height * 16; // 4 * 4 floats (RGBA)
rgbaGPUBuffer.Usage                 = D3D11_USAGE_DEFAULT;
rgbaGPUBuffer.BindFlags             = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
rgbaGPUBuffer.CPUAccessFlags        = 0;
rgbaGPUBuffer.MiscFlags             = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
rgbaGPUBuffer.StructureByteStride   = 4; // shader will output one rgba component by one

我有一个无序访问视图:

D3D11_UNORDERED_ACCESS_VIEW_DESC descView;
descView.Format                     = DXGI_FORMAT_UNKNOWN;
descView.ViewDimension              = D3D11_UAV_DIMENSION_BUFFER;
descView.Buffer.FirstElement        = 0;
descView.Buffer.NumElements         = rgbaGPUBuffer.ByteWidth / rgbaGPUBuffer.StructureByteStride;
descView.Buffer.Flags               = 0;

缓冲区的使用必须是D3D11_USAGE_DEFAULT并且不能设置CPUAccessFlags。因此,访问的视图格式必须是DXGI_FORMAT_UNKNOWN。具有讽刺意味的是,一旦计算着色器完成,输出缓冲区实际上保存 DXGI_FORMAT_R8G8B8A8_UNORM 格式。我的渲染目标交换链是那种格式,我无法对数据做任何事情。

  1. 我无法访问它,因为无法设置 CPUFlags。
  2. 我无法复制,因为当源和目标的资源类型不同时,CopyResource 不起作用。

那么,问题来了,这个数据怎么用?

它们是 GPU 可以写入的资源与 CPU 可以读取的资源之间的屏障。

如果您需要回读(并且中断并行性,除非您从 gpu 工作添加几帧延迟到 cpu 工作),唯一的方法是创建一个没有 gpu 绑定的单独资源在 D3D11_USAGE_STAGING 池和 运行 中 CopyResource 将您的 gpu 工作转移到 cpu 可访问资源。