我正在尝试使用 SharpDX 2.5 在 WPF 中实现 DirectX 11。遗憾的是http://directx4wpf.codeplex.com/和http://sharpdxwpf.codeplex.com/不适用于 SharpDX 2.5。我也无法将 WPFHost DX10 示例移植到 DX11,并且此示例的完整代码包已关闭: http: //www.indiedev.de/wiki/DirectX_in_WPF_integrieren
有人可以建议另一种实施方式吗?
我正在尝试使用 SharpDX 2.5 在 WPF 中实现 DirectX 11。遗憾的是http://directx4wpf.codeplex.com/和http://sharpdxwpf.codeplex.com/不适用于 SharpDX 2.5。我也无法将 WPFHost DX10 示例移植到 DX11,并且此示例的完整代码包已关闭: http: //www.indiedev.de/wiki/DirectX_in_WPF_integrieren
有人可以建议另一种实施方式吗?
SharpDX 通过SharpDXElement支持 WPF 。
查看Samples存储库中的Toolkit.sln
- 所有WPF
名称中都SharpDXElement
用作渲染表面的项目:
MiniCube.WPF
- 演示基本的 SharpDX-WPF 集成;MiniCube.SwitchContext.WPF
- 演示当 Game 实例的生命周期与 SharpDXElement 的生命周期不同时的基本场景(换句话说 - 当需要在另一个表面上切换游戏渲染时)。MiniCube.SwitchContext.WPF.MVVM
- 与上面相同,但更多的是“MVVM 方式”。更新:SharpDX.Toolkit 已被弃用,不再维护。它被移动到一个单独的存储库。Toolkit 示例已被删除,但是我将链接更改为仍然存在的变更集。
您仍然可以使用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。
它现在应该可以工作了。