SharpDX 2.5 в DirectX11 в WPF

Я пытаюсь реализовать DirectX 11 с помощью SharpDX 2.5 в 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 ответов


SharpDX поддерживает WPF через SharpDXElement.

посмотреть в каталоге образцы репозиторий на Toolkit.sln - все проекты, которые WPF использовать имя SharpDXElement как рендеринг поверхности:

  • MiniCube.WPF - демонстрирует базовую интеграцию SharpDX-WPF;
  • MiniCube.SwitchContext.WPF - демонстрирует базовый сценарий, когда время жизни экземпляра игры отличается от времени жизни SharpDXElement (другими словами-когда есть необходимо переключить рендеринг игры на другую поверхность).
  • MiniCube.SwitchContext.WPF.MVVM - то же, что и выше, но больше "MVVM-way".

Обновление: SharpDX.Инструментарий устарел и больше не поддерживается. Он перемещается в отдельный репозиторий. Образцы инструментария были удалены, однако я изменил ссылку на набор изменений, где они все еще присутствуют.


можно использовать http://sharpdxwpf.codeplex.com/.

для правильной работы с SharpDX 2.5.0 вам необходимо сделать несколько модификаций.

1) в проекте Sharp.WPF в классе DXUtils.CS в методе

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 в файле 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.

и это должно работать сейчас.