如何通过Angle将Vortice的Skia与DirectX对接实现跨平台渲染?
摘要:本文将从控制台开始,以最简单方式和大家展示如何通过 Angle 将 Skia 和 DirectX 对接。对接之后,可以利用 Angle 的能力,让 Skia 使用到 DirectX 引擎渲染能力
ANGLE 是谷歌开源的组件,提供将 OpenGL ES API 调用转换为实际调用 DirectX 引擎执行渲染的能力。详细请看: https://github.com/google/angle
整体的步骤是:
基础且通用地创建 Win32 窗口
初始化 DirectX 相关,包括创建 DirectX 工厂和 DirectX 设备,枚举显示适配器等
初始化 Angle 和与 DirectX 对接
开始之前,按照 .NET 的惯例,先安装必要的 NuGet 库。安装之后的 csproj 项目文件代码如下
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<IsAotCompatible>true</IsAotCompatible>
<PublishAot>true</PublishAot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Vortice.Direct3D11" Version="3.8.2" />
<PackageReference Include="Vortice.DirectComposition" Version="3.8.2" />
<PackageReference Include="Vortice.DXGI" Version="3.8.2" />
<PackageReference Include="Vortice.Win32" Version="2.3.0" />
<PackageReference Include="Avalonia.Angle.Windows.Natives" Version="2.1.25547.20250602" />
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.257">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="SkiaSharp" Version="3.119.1" />
<PackageReference Include="MicroCom.Runtime" Version="0.11.0" />
</ItemGroup>
</Project>
在本文的过程中,需要用到一些 Win32 方法和 OpenGL 等相关定义。我使用 CsWin32 库辅助定义 Win32 方法,再从 Avalonia 拷贝 OpenGL 相关定义
本文在正文部分只提供关键的代码。在本文末尾部分贴出 Program.cs 的完全代码,本文的核心逻辑都在 Program.cs 里面实现,核心代码大概 300 多行,适合一口气阅读。其他辅助代码,如 OpenGL 定义类等,就还请大家从本文末尾提供的整个代码项目的下载方法进行下载获取代码
创建窗口
创建 Win32 窗口仅仅只是想拿到窗口句柄,不是本文重点,这里就忽略 CreateWindow 方法的实现
// 创建窗口
HWND window = CreateWindow();
// 显示窗口
ShowWindow(window, SHOW_WINDOW_CMD.SW_NORMAL);
以上代码的 ShowWindow 是标准的 Win32 方法,由 CsWin32 库生成。
