CPU是否可以访问用于渲染目标的BackBuffer
Can CPU access to BackBuffer used for Render Target?
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
成员中,因为它们要么被忽略,要么被视为错误而拒绝。
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 为测试目标创建具有不同源文件夹的文件
- 使用源向量作为目标
- 是否可以用C++/WinRT将windows 10.0.14393作为目标
- 在 CMake 中为每个目标设置编译器/链接器标志
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 CMake 中对目标依赖项进行分组?
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 如何为包含头文件的目标编写生成文件?
- 线性优化目标函数中的绝对值
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 字符串函数在目标C++上运行时C++返回空
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 请求最简单的 OpenMP 目标 GPU 示例
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径