使用WPF和SlimDx(DirectX 10/11)
我现在在WinForms中使用SlimDX一段时间,但现在想切换到WPF。但是,我无法弄清楚如何让DX10/11与WPF一起工作。 SlimDX的2月份版本提供了一个WPF示例,但只适用于DX 9。 我发现了以下解决方案:http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/437/Direct3D-10-11-Direct2D-in-WPF.aspx 但无法使其与SlimDX配合使用。我的主要问题是共享资源句柄,因为我不知道如何从SlimDX纹理检索共享句柄。我无法找到任何有关此主题的信息。使用WPF和SlimDx(DirectX 10/11)
在C++代码看起来是这样的:
HRESULT D3DImageEx::GetSharedHandle(IUnknown *pUnknown, HANDLE * pHandle)
{
HRESULT hr = S_OK;
*pHandle = NULL;
IDXGIResource* pSurface;
if (FAILED(hr = pUnknown->QueryInterface(__uuidof(IDXGIResource), (void**)&pSurface)))
return hr;
hr = pSurface->GetSharedHandle(pHandle);
pSurface->Release();
return hr;
}
基本上,我想要做的(因为我认为这是解决方案),是共享Direct3d9DeviceEx之间的纹理(渲染的WPF D3DImage)和一个Direct3d10Device(我的场景的纹理渲染目标)。
任何正确的方向指针非常赞赏。
有一个名为WindowsFormsHost的控件,也许你可以将你当前的WinForm控件以这种方式进行整合?
看看D3DImageEx。 http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/437/Direct3D-10-11-Direct2D-in-WPF.aspx 您提供了对rendertarget的引用,但必须使用Shared标志创建它。尽管如此,我无法使用交换链。
let renderTargetDescription = Texture2DDescription( Width=width,
Height=height,
MipLevels=1,
ArraySize=1,
Format = Format.B8G8R8A8_UNorm,
SampleDescription = SampleDescription(Count = 1),
BindFlags = (BindFlags.RenderTarget ||| BindFlags.ShaderResource),
OptionFlags = ResourceOptionFlags.Shared)
我在上面的问题中发布了相同的链接,不幸的是它提供了解决我的问题的方法。 – slurmomatic 2010-06-11 08:33:39
这样的工作,但它并没有很好地与WPF集成。 WinForms控件必须位于最前面,不能与其他WPF控件等重叠。 但是,我设法让DX10/WPF很好地运行。我无法弄清楚SlimDX中是否提供了GetSharedHandle,所以我检查了源代码并添加了一些C++代码,以便为我提供所需的功能。 如果我能找到时间,我会更详细地发布和更新并解释我的解决方案。 – slurmomatic 2010-03-31 09:00:47