CPU是否可以访问用于渲染目标的BackBuffer

Can CPU access to BackBuffer used for Render Target?

本文关键字:目标 BackBuffer 用于 是否 访问 CPU      更新时间:2024-09-22

strong text我对DirectX11非常陌生,并开始学习。我在D3D11_BUFFER_DESC结构中看到了D3D11_USAGE枚举,并搜索了每个枚举的含义。

D3D11_DEFAULT是指GPU可以读/写,但不允许来自CPU的所有访问。因此,此选项用于渲染目标所使用的后缓冲区。

然后,如果我使用DXGI_USAGE_RENDER_TARGET_OUTPUT选项生成交换链以供使用,并获取后缓冲区并从后缓冲区创建渲染目标,那么CPU是否可以访问后缓冲区或渲染目标

typedef struct DXGI_SWAP_CHAIN_DESC
{
DXGI_MODE_DESC BufferDesc;
DXGI_SAMPLE_DESC SampleDesc;
DXGI_USAGE BufferUsage;
UINT BufferCount;
HWND OutputWindow;
BOOL Windowed;
DXGI_SWAP_EFFECT SwapEffect;
UINT Flags;
}   DXGI_SWAP_CHAIN_DESC;

基于MSDC文档(在文档中,它说"Swap chain’s only support the DXGI_CPU_ACCESS_FIELD part of DXGI_USAGE"(,CPU无法访问,但我找不到明确的指令。我说得对吗?

那么,CPU是否可以访问用于渲染目标的BackBuffer

根据您引用的MSDN文档,CPU无权访问交换链缓冲区。

我不知道为什么你首先需要从后台缓冲区读取数据——从CPU读取GPU上生成的数据的过程太慢了,你最好先在CPU上完成所有渲染,或者重新设计算法,这样你就不需要从CPU访问数据。一般来说,第二种是最好的选择——D3D的设计是将数据从CPU推送到GPU,而不是将数据从GPU读取到CPU。

事实上,如果您查看D3D11_USAGE的文档,您会发现创建具有CPU直接读取访问权限的资源的唯一方法是将其创建为临时资源(D3D11_USAGE_STAGING(,它不支持创建视图。使用D3D11_USAGE_DYNAMIC创建的资源可以由CPU写入,但不能读取;使用D3D11_USAGE_DEFAULT创建的资源可通过UpdateSubresource复制,但不能由CPU交互;使用D3D11_USAGE_IMMUTABLE创建的资源在创建后根本不能修改。

交换链使用等效于D3D11_USAGE_DEFAULT的DXGI创建其资源,该DXGI拒绝CPU访问数据。MSDN只是告诉您这种情况,不要将任何CPU访问标志放入Usage成员中,因为它们要么被忽略,要么被视为错误而拒绝。