EasyGPU——在 EasyX 中用 C++ 进行 GPU 编程
简介
GPU 编程是现代图形学中无法绕开的一环。EasyX 为初学者提供了一个不错的起步框架,然而,如果想要进一步开展我们的研究自然就不可能局限于 CPU 上。然而,如果想要利用 GPU 的能力开展我们的研究,就需要去研究各种复杂的图形 API——OpenGL、Vulkan 等。这些 API 的学习成本非常高,往往不是一个刚刚学会熟练 EasyX 的新手可以上手的。因此,EasyGPU 诞生了。EasyGPU 的使命之一就是搭建一个学习成本低的学习平台,方便新手快速上手 GPU 编程。
无论你是有经验的开发者,需要一个轻量的 GPGPU 计算框架,还是一个学生想要在你的大作业中添加创新点或制作出更出彩的程序,还是教授图形学课程的教授老师,这个库都能够符合你的需求!
EasyGPU 没有任何复杂的第三方依赖,图形 API 采用系统自带的 OpenGL,省去了复杂的环境配置时间,方便新手快速上手。下面是用 EasyGPU 写的一个简单小程序:
#include <GPU.h>
#include <graphics.h>
#pragma comment(lib, "opengl32.lib")
int main() {
initgraph(640, 480);
BeginBatchDraw();
Uniform<int> time;
Texture2D<PixelFormat::RGBA8> screenBuffer(getwidth(), getheight());
Kernel2D kernel([&](Int& X, Int& Y) {
auto screen = screenBuffer.Bind();
auto t = ToFloat(time.Load()) / 100;
auto r = Abs(Cos(0.5 * (t + ToFloat(X) / getwidth())));
auto g = 0.7 * Abs(Cos(0.2 * (t + ToFloat(Y) / getheight())));
auto b = 0.3 + Abs(0.2 * Cos(0.5 * t));
screen.Write(X, Y, MakeFloat4(r, g, b, 1.0) * 1.5);
}, 16, 16);
while (true) {
time_t start = clock();
time = start;
kernel.Dispatch(getwidth() / 16, getheight() / 16, true);
screenBuffer.Download(GetImageBuffer());
FlushBatchDraw();
}
EndBatchDraw();
return 0;
}
运行上面的代码,将会得到一个随着时间自由流动的渐变窗口:

核心代码仅需 40 行不到,即可调用 GPU 完成渲染工作。
兼顾简单与强大
在保证简易的同时,EasyGPU 提供了强大的 API 接口——自定义结构体、Buffer、Texture、Uniform、Callable 等功能一应俱全。使用 EasyGPU,真正解放你的创造力,以下都是用 EasyGPU 创建的程序,都可以在我们的代码仓库的 examples 中查看——

光线追踪渲染器

SDF 渲染器

mandelbrot 图形

体积云渲染
工作原理
EasyGPU 使用了 embedded DSL(eDSL)技术来使得 GPU 编程不再是一件困难复杂的事情。我们通过 AST 捕获技术捕获 C++ 的 AST,并生成对应的中间表示(Intermediate Representation,IR)并转化成计算着色器语言(Compute Shader),最终提交给 GPU 执行。整个过程由 EasyGPU 自动完成,无需用户手动编写任何 GPU 代码或与 GPU 进行直接接触。用户可以直接使用自己熟悉的 C++ 语言编写代码而不至于去学习新的着色器语言与对应的图形 API,使得学习门槛大大降低。
速度评测
为了直观展示 GPU 加速的算法优势,我们设计了一个简单的实验——使用 CPU 软实现和 EasyGPU 分别实现高斯模糊,并测量其运行时间,测试使用的源码请在此处下载。
测试平台如下:
| 编译器 | VS2026(INSIDER) |
| 内存 | 64GB DDR5 |
| 显卡 | RTX 4050 Laptop |
| CPU | Intel(R) Core(TM) i5-13500H |
测试结果如下:
========================================
GPU Gaussian Blur Performance:
Image Size: 1017 x 1017
Radius: 50, Sigma: 6.0
GPU Time: 77.6274 ms
========================================
========================================
CPU Gaussian Blur Performance:
Image Size: 1017 x 1017
Radius: 50, Sigma: 6.0
CPU Time: 2972.77 ms
========================================
可见 GPU 比 CPU 实现快了约 38。
下载与配置
环境要求
我们的理论最低环境要求如下:
| 编译器要求 | 最低 Visual Studio 2017(或 C++20 标准支持完整的任何 C++ 编译器) |
| OpenGL 版本要求 | 4.3 及以上 |
| C++ 标准要求 | C++20 及以上 |
下载源码
如果你熟悉 git,我们鼓励你使用 git 克隆我们的仓库:
git clone https://github.com/EasyGPU/EasyGPU.git
或者可以直接访问 GitHub 仓库连接来直接下载代码。
如果喜欢我们的代码,欢迎您 star 我们的仓库!
配置环境
此处以 VS2020 为例,如果你熟悉 CMake 你可以直接使用仓库下的 CMakeLists.txt 而跳过本教程。
1. 创建一个空项目



2. 项目创建成功后,创建一个名为“EasyGPU”的过滤器

3. 将 EasyGPU 的源码文件夹放到你的项目源码根目录中

4. 将 EasyGPU 下的 include/source/third 文件夹都拖到 EasyGPU 过滤器下

5. 右击项目-属性(property)

6. 配置属性-C/C++-常规,找到“附加包含目录”,点击进入

7. 点击
后再点击
进入文件夹选择界面,分别选择“EasyGPU”目录下的“third”和“include”文件夹
8. 配置属性-C/C++-语言-C++ 标准,选择”ISO C++20 Standard (/std:c++20)“(如果已是则无需重新选择)

9. 配置属性-C/C++-语言-预处理-启用标准预处理设置为”Yes (/Zc:preprocessor)“。

10. 创建”main.cpp“输入测试代码:
#include <GPU.h>
#include <graphics.h>
#pragma comment(lib, "opengl32.lib")
int main() {
initgraph(640, 480);
BeginBatchDraw();
Uniform<int> time;
Texture2D<PixelFormat::RGBA8> screenBuffer(getwidth(), getheight());
Kernel2D kernel([&](Int& X, Int& Y) {
auto screen = screenBuffer.Bind();
auto t = ToFloat(time.Load()) / 100;
auto r = Abs(Cos(0.5 * (t + ToFloat(X) / getwidth())));
auto g = 0.7 * Abs(Cos(0.2 * (t + ToFloat(Y) / getheight())));
auto b = 0.3 + Abs(0.2 * Cos(0.5 * t));
screen.Write(X, Y, MakeFloat4(r, g, b, 1.0) * 1.5);
}, 16, 16);
while (true) {
time_t start = clock();
time = start;
kernel.Dispatch(getwidth() / 16, getheight() / 16, true);
screenBuffer.Download(GetImageBuffer());
FlushBatchDraw();
}
EndBatchDraw();
return 0;
}
得到结果:

恭喜你!成功配置了 EasyGPU,接下来就可以开始你的 GPU 编程之旅了!
在我们的 GitHub 仓库中由较为完善的文档,且接下来,我会在 CodeBus 等平台上更新 EasyGPU 库的使用教程。欢迎各位在 CodeBus 分享自己用 EasyGPU 创建的项目。
如果你在使用过程中有任何问题,欢迎你在 GitHub 中提出 issue 或加入我们的群聊(761990769)参与讨论,或者你也可以直接联系我的邮箱:qiuzhengyu@siggraph.org 进行讨论。
添加评论
取消回复