用于 WPF 和 WinForms 的 DirectX 11 3D 渲染引擎
Ab3d.DXEngine 是一种超快的 3D 渲染引擎,可用于 .Net 桌面应用程序。采集 by Ω578867473
Ab3d.DXEngine采用超快的多线程渲染技术,可以充分利用显卡,提供与使用C++时几乎相同的极致性能。
该引擎还支持具有逐像素照明、PBR(基于物理的渲染)材质和阴影的顶级视觉效果。
Ab3d.DXEngine 非常易于使用。您可以使用 WPF 3D 对象来定义 3D 场景、相机和灯光。更重要的是,它与Ab3d.PowerToys库配合得很好——终极 3D 工具包,为您提供了许多构建块来创建 3D 应用程序。
Ab3d.DXEngine is not another game engine (like Unity) that forces you to use its game editor, its architecture and requires many hacks and tricks to be used in a standard .Net application. The Ab3d.DXEngine is a new rendering engine that is built from ground up with the purpose to be used in standard Desktop .Net applications.
版本 5.2
- 添加了 FaceColorMaterial 和 FaceColorEffect,它们可以通过为模型的每个面(三角形)指定不同的颜色来渲染 3D 模型。
- 添加了 MeshCollider,可用于测试网格与 3D 位置、Rect3D、BoundingBox 或其他网格之间的碰撞。
- 为 MeshCollider 添加了 GetClosestPosition。它可用于获取最接近指定 3D 位置的顶点的索引。
- MultiPolyLineVisual3D 中的所有线条现在都通过一次绘制调用进行渲染。当渲染多条折线时,这会极大地提高性能(这可以通过将 DXScene.RenderMultiPolyLinesWithOneDrawCall 设置为 false 来禁用)。
- 将 LineIndices 数组添加到 ScreenSpaceLineMesh。设置后,网格将从 LineIndices 创建一个索引缓冲区(用于通过一次绘制调用渲染多条折线)。
- 修复了启用平面阴影渲染时渲染 3D 线和实例对象的问题。
- 添加了为 DXEngine 的 SimpleMesh 和 GeometryMesh 创建 OctTree 的支持。这大大提高了使用 DXEngine 的网格时的命中测试性能。
- 当网格中的顶点(位置)数大于或等于 DXScene.DXHitTestOptions.MeshPositionsCountForOctTreeGeneration 时,为实现 IOctTreeMesh(SimpleMesh、GeometryMesh、DXMeshGeometry3D)的网格自动生成 OctTree。当DXScene.DXHitTestOptions.GenerateOctTreeOnMeshInitialization 为true(默认为false)时,当网格添加到MeshObjectNode 且顶点数足够时(MeshPositionsCountForOctTreeGeneration),OctTree 会自动生成。这在以前的版本中已经适用于 DXMeshGeometry3D(从 WPF 的 MeshGeometry3D 生成)。
- 更新网格后更新 DXMeshGeometry 中的 OctTree。
- 向 CameraDistanceSortedRenderingQueue 添加了 CheckAllBoundingBoxCorners 属性。当设置为 true 时,透明度排序会检查边界框的所有角,而不仅仅是中心位置。这速度较慢,但可能会解决一些透明度排序问题 - 请参阅新的“透明度排序类型”示例以获取更多信息。
- 向 Ab3d.DirectX.CommonUtils 添加了 GetPositionFromVertexBuffer 和 GetPositionsFromVertexBuffer 静态方法。它们可用于从通用顶点缓冲区数组(可以是 PositionNormalTexture、PositionNormal、PositionColor 等数组)中读取位置
- 添加了 ITriangularMesh 接口,该接口定义了 TrianglesCount 属性和 GetTrianglePositions 方法,可用于从实现该接口的网格中获取三角形位置。
- 改进了调用 GetAllHitResults 方法时的命中测试 - 当光线命中由另一个三角形共享的三角形边时,新版本不会返回两个命中结果。在这种情况下,以前的版本返回两个命中结果,每个结果都有自己的 TriangleIndex。因为在这种情况下,光线只穿过物体一次,所以新版本只返回一次命中结果。如果您希望获得两个命中结果(与之前的版本一样),请将 DXScene.DXHitTestOptions.ReportAllHitTrianglesWhenEdgeIsHit 设置为 true。
- 改进了几何着色器中粗线的渲染,以便在更改视图的纵横比(宽度除以高度)时,线的宽度方向不会改变。此外,当线条方向更改时,线条图案的比例会保留。
- 添加了 IMeshNode 接口。它由提供 GetMesh 方法的 SceneNodes 实现,可以返回一个使用过的网格。
- 将 XRayMaterial 中的 ReadZBuffer 和 WriteZBuffer 的默认值设置为 true。
- 向 MeshBase 类添加了 VertexCount 属性,因此可以从任何 DXEngine 的网格对象中获取顶点(位置)的数量。
- 向 Ab3d.DirectX.HitTester 类添加了静态 AddAllMeshHitResults 方法。这可以用来代替调用 GetAllHitObjects 并允许重用命中结果列表(防止在每次调用 GetAllHitObjects 时生成新列表)。
- 在处理 DXScene 之前移除所有 sprite 批次时,正确处理 DefaultRenderSpritesRenderingStep。
- 当调用 DXViewportView.Refresh 或调用 DXScene.RenderScene 且 forceRender 为真时,即使隐藏 DXViewportView 或 DXScene.IsEnabled 为假,也会渲染场景。
- 防止在使用子 DXViewportView 对象和使用自定义根 SceneNode 对象调用命中测试方法时引发异常。
- 防止在调整使用 DirectXOverlay 的 DXViewportView 大小时有时可能发生的错误,没有超级采样,没有抗锯齿,并显示许多具有多线程的对象。
- 向 DXViewportView 添加了 DefaultSystemAdapterChanged 事件。用户可以订阅此事件,以便在更换主显卡时收到通知(在某些笔记本电脑上,外接显示器断开连接后可能会发生这种情况)。在这种情况下,不能再使用共享纹理,因此 DXEngine 切换到使用 WritableBitmap。这可能非常慢。因此,建议在此事件处理程序中保存 3D 场景的状态,然后处理 DXViewportView 并创建一个新的 DXViewportView(这将使用新的主显卡并允许再次使用共享纹理)。
Ab4d.SharpEngine 是用于桌面和移动 .Net 应用程序的跨平台 3D 渲染引擎。
现有的渲染引擎 Ab3d.DXEngine 使用 DirectX 11。因此,它只能在 Windows 上使用。新引擎使用 Vulkan API。由于它是使用 .NET 6 构建的,新引擎是真正的跨平台,可以在 Windows、Linux(包括 Raspberry PI 4)、macOS、Android 和 iOS 上使用。
我知道现在你想问我:web 呢?我正在使用 WebAssembly 监视 Blazor 的状态。我认为事情正在朝着正确的方向发展,但目前这项技术还不足以支持更复杂的 3D 图形应用程序。主要问题是 WebAssembly 无法直接访问 Canvas,因此每次调用都需要通过 java 脚本。因为 3D 渲染引擎需要执行大量的 WebGL(或 WebGPU)调用,所以这会很慢。此外,在我看来,对于高端和要求苛刻的 3D 图形,网络总是很慢。不管怎样,长期计划是也提供对 web 的支持,以便相同的 c# 代码也可以在浏览器中运行。
Vulkan 也是一个开销非常小的 API,这使得它比 DirectX 11 快得多。此外,Vulkan 支持添加到新显卡的所有新功能,包括光线追踪。这并不意味着 Ab3d.DXEngine 已经支持光线追踪,但有可能在未来添加该功能和其他新功能。
因为新的渲染引擎是从头开始构建的,所以可以使用 Ab3d.PowerToys 和 Ab3d.DXEngine 的所有专业知识和经验来使其编程 API 干净且更易于使用。我承认在使用 Ab3d.DXEngine 和 Ab3d.PowerToys 时,API 在所有情况下都不是很好。Ab3d.PowerToy 构建在可扩展性不强的 WPF 3D 对象之上,因此需要做出一些妥协(例如,相机派生自 FrameworkElement 而不是 Camera)。此外,Ab3d.DXEngine 将所有 WPF 3D 和 Ab3d.PowerToys 对象转换为它自己的对象。这意味着应用程序有每个对象的两个版本。在其他情况下,必须使用一些技巧来为 Ab3d.PowerToys 和 WPF 3D 对象提供 Ab3d.DXEngine 功能(例如使用 SetDXAttribute)。所以,拥有易于使用的 API 是新引擎的主要目标之一。
希望您已经对新的渲染引擎感到兴奋。
在这种情况下,只需跳转到GitHub 上的示例页面:Ab4d.SharpEngine.Samples
您将在其中找到显示如何将 Ab4d.SharpEngine 与 WPF、AvaloniaUI、WinUI 3、SDL、Glfw 结合使用的解决方案。一些示例将仅在 Windows 上运行;有些还将在 Linux 和 macOS 上运行。有些将在 Android 上运行。iOS 示例将在不久的将来推出。我还计划添加对 WinForms 和 MAUI 的支持。如果您知道任何其他众所周知的 UI 框架,请告诉我,我也会尽力提供支持。
另请查看 GitHub 上的自述文件,因为它提供了许多其他信息。
因为您是 Ab3d.PowerToys 和 Ab3d.DXEngine 的现有用户,所以您可能对将新引擎与当前库进行比较非常感兴趣。
让我们从Ab3d.DXEngine 和 Ab3d.PowerToys 的优点开始:
- Ab3d.DXEngine和Ab3d.PowerToys是非常成熟的产品,经过众多客户的“现场”测试和验证。
- 这两个库目前提供更多功能,并附带更多示例,可用作满足您需要的代码模板。
- Ab3d.DXEngine 支持多线程,目前在许多用例中提供更快的 3D 渲染。
- Ab3d.DXEngine 可以在没有显卡时使用软件渲染(例如在虚拟机或服务器上)。
- Ab3d.DXEngine 和 Ab3d.PowerToys 可以在旧的 .Net 版本上运行,包括 .Net Framework 4.5+。
Ab4d.SharpEngine 的优点:
- Ab4d.SharpEngine 可以在多个平台上运行。您可以开始为 Windows 编写代码,然后只需添加对 Linux、macOS、Android 和 iOS 的支持。或者将应用程序的一小部分移植到其他平台。
- Ab4d.SharpEngine 使用 Vulkan API,这是最先进的图形 API。随着新版本显卡的发布,它正在积极开发并获得新功能。这提供了支持所有当前和未来图形功能的选项(例如光线追踪 - DirectX 11 无法实现)。
- 如前所述,Ab4d.SharpEngine 有一个非常简洁易用的编程 API。
- 使用 WPF 对象非常慢(访问 DependencyProperties 有很多开销)。此外,Ab3d.DXEngine 需要将所有 WPF 对象转换为它自己的对象。在 Ab4d.SharpEngine 中处理对象要快得多。
- Vulkan 是比 DirectX 11 快得多的图形 API。虽然 Ab4d.SharpEngine 还没有使用所有最快的算法(没有多线程),但未来该引擎将比 Ab3d.DXEngine 快得多。
- Ab4d.SharpEngine 建立在 .NET 6 之上,由于使用了 System.Numerics、Span 和其他改进的 .NET 功能,它提供了许多性能优势。
- 未来 Ab4d.SharpEngine 将提供比 Ab3d.DXEngine 和 Ab3d.PowerToys 更多的功能。
因此,如果您有一个使用 Ab3d.PowerToys 和 Ab3d.DXEngine 的大型复杂应用程序,我不建议您尝试将其移植到新引擎。您不能只是将代码复制并粘贴到新引擎中。尽管两个引擎的思想和原理仍然相同,例如有 TargetPositionCamera 和 MouseCameraController - 两者具有几乎相同的属性和方法。但也有许多较小的差异,例如 BoxVisual3D 现在是 BoxModelNode。无论如何,如果您知道如何使用现有引擎,您也会对新引擎感到非常熟悉。
但是,如果您开始构建具有 3D 图形的新应用程序或希望将大型应用程序的较小部分(例如具有一些附加功能的查看器)移植到更移动的格式,那么新引擎是一个完美的选择为了那个原因。此外,如果您对如何在 .NET 中为其他平台进行编程感到好奇,或者在 12 月会有更多时间,如果您可以试用新引擎并提供一些反馈,我将非常高兴(您也可以使用讨论或在 GitHub 上发布问题,或者简单地使用电子邮件、论坛或反馈表)。
但请不要要求太高。这是第一个公开测试版,有些东西可能无法按预期工作。在这些情况下,请参阅 GitHub 上的故障排除部分以获取更多信息。
让我也分享一下新引擎的计划路线图。
在接下来的几周和几个月里,我将尝试发布包含修复和改进的新测试版。几个月后,可能在 2023 年第二季度或第三季度,应该会发布第一个生产就绪版本。也许引擎的某些部分仍将处于测试阶段,例如 AvaloniaUI、MAUI、macOS 和 iOS 支持。计划是让主要和最常见的部分准备好投入生产:Windows(WPF、WinForms、SDL、Glfw)、主要的 Linux 发行版(SDL、Glfw)和 Android。