从DirectX11到Directx9共享资源
Share Resource from DirectX11 to Directx9
let,我有两个设备,第一个是DirectX9,第二个是DirectX11。我正在做的是计算粒子,并通过D3D11的计算着色器将它们的数据保存在D3D11纹理中,然后我想在我的D3D9设备中使用D3D11质地来显示它。我正在使用以下代码。。
在D3D11设备中。。(m_pBuffer为ID3D11Buffer)
IDXGIResource* pTempResource(NULL);
hr = m_pBuffer->QueryInterface( __uuidof(IDXGIResource), (void**)&pTempResource );
hr = pTempResource->GetSharedHandle(&SharedHandle); //successful
然后在D3D9设备中。。。
hr = g_pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_RENDERTARGET,D3DFMT_A32B32G32R32F,D3DPOOL_DEFAULT,&pSharedTexture9,&SharedHandle);
我遇到的错误是"Direct3D9:(错误):打开的和创建的资源不匹配,无法打开共享资源。"
编辑:好的,当我在dx9中使用D3DFMT_A16B16G16R16F和在dX11中使用DXGI_FORMAT_R16B16A16_FLOAT创建纹理时,它起作用了。而使用D3DFMT_A32B32G32R32F和DXGI_FORMAT_R32B32A32_FLOAT则给出了上述错误。
由于不允许使用这些纹理格式,因此会出现此错误。
从D3D9到D3D11共享的纹理有以下限制:
- 纹理必须是2D
- 只允许1 mip级别
- 纹理必须具有默认用途
- 纹理必须是只读的
- 不允许使用MSAA纹理
- 绑定标志必须设置SHADER_RESOURCE和RENDER_TARGET
- 仅允许R10G10B10A2_UNORM、R16G16B16A16_FLOAT和R8G8B8_UNORM格式
发件人http://msdn.microsoft.com/en-us/library/windows/desktop/ff476531%28v=vs.85%29.aspx
因此,对于共享纹理,您只能使用上述三种格式。此外,如果您打算在Direct3D9中将纹理用作后缓冲区,则会进一步限制为R8G8B8A8_UNORM和R10G10B10A2_UNORM。来源:http://msdn.microsoft.com/en-us/library/windows/desktop/bb172558%28v=vs.85%29.aspx#BackBuffer_or_Display_Formats
- 拥有或在对象之间共享资源
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- 为什么我的程序寻找共享资源.dll而不是Commons.lib
- 多个线程访问共享资源
- C++11 中 3 个线程和 2 个共享资源的同步问题
- 锁定构造函数和析构函数中的共享资源
- qtmake-两个项目/目标之间的共享资源
- 在多线程程序中共享资源 C++ 与 Java
- C++/提升共享资源类,用于管理资源生命周期,如shared_ptr
- 高效读取共享资源
- 从DirectX11到Directx9共享资源
- 使用 std::weak_ptr 共享资源所有权
- 如何将共享资源对象的生存期绑定到其用户生存期的联合中?
- 线程共享资源C++
- CppUtest在测试之间共享资源,未定义引用
- 共享资源,如带宽同步
- 写入互斥的共享资源
- 参数化和共享资源测试在googletest