2013-09-20 4 views
12

Я пытаюсь реализовать 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_integrierenSharpDX 2.5 в DirectX11 в WPF

Может ли кто-нибудь предложить другой способ реализации?

+0

Почему вы не можете удалить образец DX10? Детали помогут другим помочь вам. Кроме того, вот аналогичный вопрос: http://stackoverflow.com/q/9095089/1339280 – shoelzer

ответ

4

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

Посмотрите в Samples хранилище на Toolkit.sln - все проекты, которые имеют WPF в использовании имени SharpDXElement в качестве рендеринга поверхности:

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

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

+0

Ссылки на SharpDXElement нарушены. Пожалуйста, обновите их. – BrainSlugs83

+0

Кроме того, мне сложно найти toolkit.sln или любые проекты с WPF в их именах. – BrainSlugs83

+0

@ BrainSlugs83 - ссылки обновлены. –

3

Вы все еще можете использовать 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.cs файле переименовать этот

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 Into SetViewport.

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