🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用。本文属于入门级博客,期望本文能让大家了解 Vortice 底层库是可以如何调用 DirectX 的功能,以及了解 DirectX 中,特别是 D2D 部分的初始化逻辑
在开始聊 Vortice 之前,必须要先聊聊 SharpDx 库。 众所周知,现在 SharpDx 已不维护,尽管 SharpDx 的不维护对咱开发影响很小,除非需要用到这几年新加的功能,否则使用不维护的 SharpDx 的问题也不大。而 Vortice 是作为 SharpDx 的一个代替的存在,是从 SharpDx 的基础上,继续开发的一个项目。 使用 Vortice 底层库,能让 C# 代码比较方便的和 DirectX 对接
从设计上,此 Vortice 库和 SharpDx 是对 DirectX 的低级封装,低级封装意味着将会让咱在开发时,必须了解非常的细节,但同时也带来了可以进行底层优化的可能
可以代替 SharpDx 的库,除了 Vortice 之外,还有很多,详细请看 SharpDx 的代替项目
在开始阅读本文之前,我期望读者已了解很多相关的知识,例如 Win32 的概念,以及 DirectX 是什么,和 .NET 框架的基础知识加 C# 的基础语法等知识。尽管本文属于入门级博客,但不会涉及到过于基础的知识
想要开始使用 D2D 绘制内容,就需要有一个用来承载绘制内容的 “画布” 对象,在 D2D 里面,对应的就是一个 ID2D1RenderTarget 类型的对象
为了能在屏幕上能看到绘制的内容,那最好是有一个窗口用来显示绘制内容。当然,使用离屏渲染也可以,只是用离屏渲染的话,自然有离屏渲染的自带的坑再加上为了能看到渲染内容而做的编码为图片的坑,这就让入门博客不友好了。本文将通过 Win32 的方式一步步创建窗口,尽可能告诉大家更多的细节
本文使用的步骤如下:
- 创建一个 Win32 窗口
- 创建 D3D11 的设备,和交换链,将 D3D 挂到窗口上
- 通过 DXGI 配合 D3D11 创建 D2D 的 ID2D1RenderTarget 进行绘制修改颜色
创建项目
本文将使用 VisualStudio 2022 作为 IDE 工具,理论上还在使用低于 VisualStudio 2022 版本的开发者,也应该升级 IDE 了
使用非 VisualStudio 作为 IDE 的,那推荐本文看着玩就好了,不要去尝试本文的代码
新建一个 dotnet 6 的控制台项目
接下来咱将从这个控制台项目开始,编写 D2D 应用
本文贴出的代码只有部分,如果构建不通过,推荐到本文的最后获取整个项目的代码。本文的所有的源代码可在本文的最后找到下载方式
安装库
找到咱 dotnet 的惯例,在使用某个库之前,就是使用 NuGet 安装库
本文需要安装以下的 NuGet 库:
- Vortice.Direct2D1
- Vortice.Direct3D11
- Vortice.DirectX
- Vortice.D3DCompiler
- Vortice.Win32
- Microsoft.Windows.CsWin32
新建的项目默认采用 SDK 风格的 csproj 项目文件格式,可以双击项目,编辑 csproj 项目文件,在项目文件上添加如下代码用来快速安装 NuGet 库
<ItemGroup>
<PackageReference Include="Vortice.Direct2D1" Version="2.1.32" />
<PackageReference Include="Vortice.Direct3D11" Version="2.1.32" />
<PackageReference Include="Vortice.DirectX" Version="2.1.32" />
<PackageReference Include="Vortice.D3DCompiler" Version="2.1.32" />
<PackageReference Include="Vortice.Win32" Version="1.6.2" />
<PackageReference Include="Microsoft.Windows.CsWin32" PrivateAssets="all" Version="0.2.63-beta" />
ItemGroup>
编辑之后的 csproj 项目文件的代码如下
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>ExeOutputType>
<TargetFramework>net6.0TargetFramework>
<ImplicitUsings>enableImplicitUsings>
<Nullable>enableNullable>
PropertyGroup>
<ItemGroup>
<PackageReference Include="Vortice.Direct2D1" Version="2.1.32" />
<PackageReference Include="Vortice.Direct3D11" Version="2.1.32" />
<PackageReference Include="Vortice.DirectX" Version="2.1.32" />
<PackageReference Include="Vortice.D3DCompiler" Version="2.1.32" />
<PackageReference Include="Vortice.Win32" Version="1.6.2" />
<PackageReference Include="Microsoft.Windows.CsWin32" PrivateAssets="all" Version="0.2.63-beta" />
ItemGroup>
Project>
加上命名空间
为了更加方便大家静态阅读代码,我特意使用了以下引用方式,让大家在阅读代码的时候,了解到对应的类型是属于哪个命名空间下
using D3D = Vortice.Direct3D;
using D3D11 = Vortice.Direct3D11;
using DXGI = Vortice.DXGI;
using D2D = Vortice.Direct2D1;
其他的引用代码如下
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using Windows.Win32.Foundation;
using Windows.Win32.UI.WindowsAndMessaging;
using static Windows.Win32.PInvoke;
using static Windows.Win32.UI.WindowsAndMessaging.PEEK_MESSAGE_REMOVE