【发布时间】:2014-09-25 07:31:40
【问题描述】:
根据这篇 ms 博客文章 http://blogs.msdn.com/b/nativeconcurrency/archive/2012/07/02/interop-with-direct3d-textures-in-c-amp.aspx
您可以从 C++AMP 直接写入后备缓冲区。
使用 Interop,您可以使用 IDXGISwapChain 获取与窗口关联的后台缓冲区的纹理对象,并直接在 C++ AMP 内核中对其进行更新。
我从 dx 设备创建了一个 amp 设备描述符,我得到了一个指向 backbuffer 的指针,然后尝试从中创建一个 amp 纹理,但我发现 backbuffer 的纹理描述符 bindFlags 只有 D3D11_BIND_RENDER_TARGET 并且我至少需要 D3D11_BIND_UNORDERED_ACCESS 或 D3D11_BIND_SHADER_RESOURCE 才能使 Concurrency::graphics::direct3d::make_texture 起作用。
如果我设置了 bindflags,我可以轻松地制作任何其他 d3d 纹理并将其连接到 amp,但对于后缓冲区上设置的标志,我无法连接它们。
以下标记为 Microsoft 社区贡献者的回答
我试图直接写入交换链的后台缓冲区。据我了解,这是无法做到的,因为创建后台缓冲区纹理时可以使用的使用标志与 C++ AMP 操作纹理所需的标志不兼容。
因此,一方面,它(从 c++AMP 写入后备缓冲区)被用作互操作的示例,另一方面它被解释为不可能......?
我目前的要求只是在 C++AMP 中生成光线追踪图像,并在 d3d 显示器上显示,而不是每帧都从显卡复制数据。我意识到我可以只生成自己的纹理,然后用它渲染一个四边形,但直接写入后台缓冲区会更简单,如果可以做到,这就是我想做的。
也许这里有人可以解释它是否可以完成以及完成此操作需要哪些步骤,或者解释说不,这确实无法完成。
在此先感谢您对此主题的任何帮助。
[编辑] 我现在找到了这个信息 https://software.intel.com/en-us/articles/microsoft-directcompute-on-intel-ivy-bridge-processor-graphics
// 这使后台缓冲区成为计算着色器写入的目标 sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT;
我之前确实尝试过,但是对 CreateSwapChainForCoreWindow 的调用失败了 TestDxAmp.exe 中 0x75251D4D 处的第一次机会异常:Microsoft C++ 异常:Platform::InvalidArgumentException ^ 在内存位置 0x0328E484。 HRESULT:0x80070057 参数不正确。
这不是很丰富。
【问题讨论】:
-
编辑了原帖