c# - 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

标签 c# c++ directx direct3d11

我使用 C++ 编写了一个 DX11 渲染器。我现在正在寻找一种为其实现编辑器/GUI 的方法。

由于我非常习惯 Windows 窗体和 WPF C# 应用程序,我正在考虑将我的渲染器放入 dll 中,从 c# 应用程序加载 dll 并使用它绘制到窗体的定义部分。这甚至可以与托管 C# 应用程序传递的窗口句柄一起使用吗?如果可以,性能如何?

根据我的理解,由于与 DX11 API 的实际通信仍然直接在 C++ 中进行,而 C# 部分只会告诉 dll 做什么,因此性能损失应该几乎没有。或者这通常是个坏主意,使用库或 D2D 直接在 C++ 中实现 GUI 是更好的方法。

最佳答案

在 WPF 中,您可以使用 D3DImage这就像您的 xaml 中的一个简单图像。总体原则如下:

  • 分配一个 Direct3D 9 纹理,这将是您的渲染目标。
  • 将其交给 D3DImage.SetBackBuffer。
  • 将渲染代码放入 CompositionTarget.Rendering 事件处理程序中。

        RenderStuffToTexture();
        d3dImage.Lock();
        d3dImage.AddDirtyRect(new Int32Rect()
        {
            X = 0,
            Y = 0,
            Height = d3dImage.PixelHeight,
            Width = d3dImage.PixelWidth
        });
        d3dImage.Unlock();
    

由于您使用的是 Direct3D 11,因此您必须使用 DXGI surface sharing与 D3D11 共享 D3D9 文本。我知道有两个例子可以说明如何做到这一点。微软D3D11Image和D3DImageEx(个人喜好,网上多处可以找到)。

关于性能,一旦您使用 WPF,您就不再需要自己进行演示。您实际上是在基于 WPF D3D9 的渲染器中编写一个小的渲染到纹理逻辑。因此,并非一切都可以控制,包括演示时间。根据我的个人经验,您绝对可以以不错的帧率渲染简单的场景。对于真正的图形密集型应用程序和严格的 FPS 要求,我会使用更轻量级(且侵入性更小)的 UI 解决方案。

请注意,您还可以使用 WinformHost 控件获取 HWND 并呈现给它。如果您想将 UI 控件覆盖在渲染的帧上,这将有一个严重的缺点 - 据我所知,您根本做不到。

关于c# - 在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54767732/

相关文章:

c++ - C++11 中唯一类型标识的最安全方法

c++ - C2259 错误 (directx 11)

c# - 在 .NET Core 类库中的 Microsoft.AspNetCore.Hosting.Abstractions 程序集中找不到 IWebHostEnvironment

c# - MVC 项目 - 两个站点相同的 Controller

c++ - 局部constexpr变量引入了编译器错误

C++ 类和嵌套成员

c# - 在单个文本框中显示查询值

c# - Controller 操作中的异步等待 : Error: Can not await 'void'

c++ - DirectX 绘制顶点数组,不绘制顶点 vector

c++ - 带 alpha 的 DrawPrimitive