【问题标题】:Using WPF and SlimDx (DirectX 10/11)使用 WPF 和 SlimDx (DirectX 10/11)
【发布时间】:2010-03-18 17:18:35
【问题描述】:

我现在使用 SlimDX 和 WinForms 有一段时间了,但现在想切换到 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 纹理中检索共享句柄。我找不到有关此主题的任何信息。

在 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(我的场景的纹理渲染目标)之间共享纹理。

非常感谢任何正确方向的指针。

【问题讨论】:

    标签: c# .net wpf directx slimdx


    【解决方案1】:

    他们发布了一些关于如何将 slimdx/directx10 与 WPF 一起使用的示例代码。这是link

    【讨论】:

      【解决方案2】:

      有一个控件叫做 WindowsFormsHost,也许你可以这样集成你当前的 WinForm 控件?

      【讨论】:

      • 这行得通,但是它不能很好地与 WPF 集成。 WinForms 控件必须在顶部,不能与其他 WPF 控件等重叠。但是,我设法让 DX10/WPF 运行良好。我不知道 GetSharedHandle 在 SlimDX 中是否可用,所以我检查了源代码并添加了一些 C++ 代码来为我提供所需的功能。如果我能找到时间,我会发布并更新并详细解释我的解决方案。
      【解决方案3】:

      看看 D3DImageEx。 http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/437/Direct3D-10-11-Direct2D-in-WPF.aspx 您提供对渲染目标的引用,但必须使用 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)
      

      【讨论】:

      • 我在上面的问题中发布了相同的链接,不幸的是它确实为我的问题提供了解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多