SharpFX 2.5在WPF中的DirectX11中

时间:2013-09-20 08:33:47

标签: c# wpf xaml directx-11 sharpdx

我正在尝试使用SharpDX 2.5将DirectX 11实现到WPF中。 遗憾的是http://directx4wpf.codeplex.com/http://sharpdxwpf.codeplex.com/与SharpDX 2.5无法正常工作。我也无法将WPFHost DX10示例移植到DX11,并且此示例的完整代码包已关闭:http://www.indiedev.de/wiki/DirectX_in_WPF_integrieren

有人可以提出另一种实施方式吗?

2 个答案:

答案 0 :(得分:4)

SharpDX通过SharpDXElement支持WPF。

查看Toolkit.sln的{​​{3}}存储库 - 其名称中WPF使用SharpDXElement作为渲染表面的所有项目:

  • MiniCube.WPF - 演示基本的SharpDX-WPF集成;
  • MiniCube.SwitchContext.WPF - 演示Game实例的生命周期与SharpDXElement的生命周期不同的基本场景(换句话说 - 当需要在另一个表面上切换游戏渲染时)。
  • MiniCube.SwitchContext.WPF.MVVM - 与上述相同,但更多'MVVM-way'。

更新:SharpDX.Toolkit已被弃用,不再维护。它被移动到一个单独的存储库。工具包样本已删除,但我将链接更改为仍存在的变更集。

答案 1 :(得分:3)

您仍然可以使用http://sharpdxwpf.codeplex.com/

为了与SharpDX 2.5.0一起正常工作,您需要做一些修改。

1)在方法

中的类DXUtils.cs中的项目Sharp.WPF中
Direct3D11.Buffer CreateBuffer<T>(this Direct3D11.Device device, T[] range)

添加此行

stream.Position = 0;

之后

stream.WriteRange(range);

所以固定方法如下所示:

public static Direct3D11.Buffer CreateBuffer<T>(this Direct3D11.Device device, T[] range)
        where T : struct
    {
        int sizeInBytes = Marshal.SizeOf(typeof(T));
        using (var stream = new DataStream(range.Length * sizeInBytes, true, true))
        {
            stream.WriteRange(range);
            stream.Position = 0; // fix
            return new Direct3D11.Buffer(device, stream, new Direct3D11.BufferDescription
            {
                BindFlags = Direct3D11.BindFlags.VertexBuffer,
                SizeInBytes = (int)stream.Length,
                CpuAccessFlags = Direct3D11.CpuAccessFlags.None,
                OptionFlags = Direct3D11.ResourceOptionFlags.None,
                StructureByteStride = 0,
                Usage = Direct3D11.ResourceUsage.Default,
            });
        }
    }

2)在文件D3D11.cs中的D3D11类中 重命名这个

m_device.ImmediateContext.Rasterizer.SetViewports(new Viewport(0, 0, w, h, 0.0f, 1.0f));

进入这个

  m_device.ImmediateContext.Rasterizer.SetViewport(new Viewport(0, 0, w, h, 0.0f, 1.0f));

即。将SetViewports设置为SetViewport。

现在应该可以了。