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.
и это должно работать сейчас.