【问题标题】:Can a DirectX surface be plotted to a WPF control?可以将 DirectX 表面绘制到 WPF 控件吗?
【发布时间】:2020-12-06 02:36:38
【问题描述】:

可以使用 DirectX 在 WPF 控件(或 WPF 可以使用的东西)上绘制一组点。

我需要在 WPF 中实现一个控件,该控件应该以 30 Hz 的更新速率绘制 16k 点,而我现在的解决方案已经用完了。

这个想法来自this问题中的评论。

任何帮助将不胜感激。

【问题讨论】:

  • 你想要的是 D3DImage 吗? msdn.microsoft.com/en-us/library/…
  • @jeffora 我真的不知道,我一直在阅读有关 D3DImage 的所有文档,它似乎很合适。但是如何绘制那个控制点的集合呢??
  • 我不是专家。您可能想从这里开始:msdn.microsoft.com/en-us/library/cc656785.aspx。一般来说,我认为您需要一个本机 DLL 来呈现 DX 内容(或使用像 SlimDX 这样的托管包装器),然后在 D3DImage 对象上使用 Lock/SetBackBuffer 等

标签: c# wpf controls directx rendering


【解决方案1】:

是的,它可以。它通常很流畅,因为 WPF 本身就是 DirectX 的实现。

查看 MS 的 Greg Schechter 博客:

Redirecting GDI, DirectX, and WPF applications

您还可以在来自 Codeproject 的 WPF 上的表面上获得 D3DImage 示例: http://www.codeproject.com/KB/WPF/D3DImage.aspx

【解决方案2】:

是的。您使用D3DImage、纹理(SharpDXSlimDX)和Surface。您需要在应用程序之外创建纹理并通过视频驱动程序或其他方式更新其内容。在 WPF 中创建 D3DImage:

Texture = new Texture(Device.DeviceEx, width, height, 1, Usage.RenderTarget, Format.A8R8G8B8, Pool.Default, ref handle);

非常重要的是你的格式必须是Format.A8R8G8B8(这是WPF的限制):

using (var surface = texture.GetSurfaceLevel(0))
        {
            var handle = surface.NativePointer;
            Lock();
                SetBackBuffer(D3DResourceType.IDirect3DSurface9, handle);
                Unlock();
        }

每次更新框架后,您只需要

Lock();
                AddDirtyRect(new Int32Rect(0, 0, PixelWidth, PixelHeight));
                Unlock();

最好把D3DImage 放在单独的Dispatcher

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2011-05-11
    相关资源
    最近更新 更多