计算着色器完成后如何使用数据?
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
格式。我的渲染目标交换链是那种格式,我无法对数据做任何事情。
- 我无法访问它,因为无法设置 CPUFlags。
- 我无法复制,因为当源和目标的资源类型不同时,
CopyResource
不起作用。
那么,问题来了,这个数据怎么用?
它们是 GPU 可以写入的资源与 CPU 可以读取的资源之间的屏障。
如果您需要回读(并且中断并行性,除非您从 gpu 工作添加几帧延迟到 cpu 工作),唯一的方法是创建一个没有 gpu 绑定的单独资源在 D3D11_USAGE_STAGING
池和 运行 中 CopyResource
将您的 gpu 工作转移到 cpu 可访问资源。
我有一个这种格式的输出缓冲区:
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
格式。我的渲染目标交换链是那种格式,我无法对数据做任何事情。
- 我无法访问它,因为无法设置 CPUFlags。
- 我无法复制,因为当源和目标的资源类型不同时,
CopyResource
不起作用。
那么,问题来了,这个数据怎么用?
它们是 GPU 可以写入的资源与 CPU 可以读取的资源之间的屏障。
如果您需要回读(并且中断并行性,除非您从 gpu 工作添加几帧延迟到 cpu 工作),唯一的方法是创建一个没有 gpu 绑定的单独资源在 D3D11_USAGE_STAGING
池和 运行 中 CopyResource
将您的 gpu 工作转移到 cpu 可访问资源。