本小结,我们就来创建一个窗口,用来显示 WebGPU 所渲染的画面。
我们知道,不同的平台有不同的创建窗口的 API。例如,Mac 平台会使用 Cocoa,Windows 会使用 MFC,Linux 会使用 X-Window 之类的东西。
但是作为 WebGPU 的学习者,我们大部分时候并不想怎么关心各个平台是如何创建窗口的。因此,我们这里则使用一个跨平台的窗口实现项目来帮我们进行跨平台的实现,
这里我们选择的项目是 GLFW,从名字可以看出来,这个项目本来是用来做 OpenGL 的,我们今天只用它创建窗口的能力。
#include <GLFW/glfw3.h>
#include <stdio.h>
int main(int argc,char **argv)
{
if (!glfwInit()) {
printf("Could not initialize GLFW!\n");
return 1;
}
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
GLFWwindow* window = glfwCreateWindow(640, 480, "Learn WebGPU", NULL, NULL);
if (!window) {
printf("Could not open window!\n");
glfwTerminate();
return 1;
}
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
可以看到,启动一个窗口的代码是很简单的。首先,你需要调用 glfw 的初始化函数,
glfwInit();
之后一行调用,glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API),则禁止了 GLFW 初始化 OpenGL 的 Context。我们前面说过,我们只用到 glfw 创建窗口的能力,不会用到其 OpenGL 的能力,所以这里进行禁用。
在之后的 glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE),禁止了窗口缩放的功能。
之后的
GLFWwindow* window = glfwCreateWindow(640, 480, "Learn WebGPU", NULL, NULL);
则调用 glfwCreateWindow 函数创建了一个 640 * 480 的窗口出来。
窗口创建出来以后,则使用了一个 while 循环,进行 glfw 各种事件的循环。在 while 的条件判断中,则使用了 glfwWindowShouldClose 函数,这个函数在你点击了关闭窗口按钮,或者右键退出之后,则会返回 true,此时将会跳出这个循环。
最后,用 glfwDestroyWindow 来销毁窗口,用 glfwTerminate 来回收资源。
这时,编译运行一下程序,你就会看到如下窗口: