我们通过 create-react-app 来创建 React18 项目,然后通过 craco 来添加 webpack 配置,再通过 typescript 来做类型检查,以此来创建一个运行 WebGPU 的前端项目。
本文要讲的是基于 react + webpack ,当然或许你平时使用的是 vue + vite。
无论是哪种框架或编译方式,这都不太重要,对于编写 WebGPU 核心的 JS 代码他们都是相同的。
其实原本计划本篇就开始讲解如何绘制三角形,但是想了想,觉得有必要先把 前端项目环境配置 讲解清楚。
后面我们所有编写的 WebGPU 示例都将在这个项目背景中进行。
我使用的是 create-react-app 5.0.1 这个版本,相对于 4.x.x 版本,它的不同之处在于:
- 它创建的项目是基于 webpack5 编译项目,而不是 webpack4
- 它默认会安装最新版的 react,而目前最新版的 react 就是 react 18
初始化项目命令:
yarn create react-app hello-webgpu --template typescript
创建成功后,打开 package.json,检查一下 react 和 react-dom 是不是
^18.0.0
。
可选操作:安装 node-sass
如果你不使用 sass,忽略这一步。
yarn add [email protected]
最新版的 node-sass 我这边一直安装不成功,所以选择安装 6.0.0 版本。
安装命令:
yarn add @webgpu/types
目前 @webgpu/types 最新版本为 0.1.13
修改tsconfig.json:
- 修改 target 将 es5 改为 esnext
- 添加 typeRoots 配置
- 增加 alias(路径别名) 对应的 paths 配置
{
"compilerOptions": {
- "target": "es5",
+ "target": "esnext",
+ "paths": {
+ "@/components/*": ["./src/components/*"],
+ "@/hooks/*": ["./src/hooks/*"],
+ "@/shader/*": ["./src/shader/*"]
+ },
+ "typeRoots": [
+ "node_modules/@types",
+ "node_modules/@webgpu/types"
]
}
}
注:使用 creact-react-app 创建的 react 项目我们默认是无法修改 webpack 相关配置的,除非你使用
yarn run eject
强行暴露配置。而 @craco/craco 可以做到不 eject 的情况下让我们添加修改 webpack 配置。
安装命令:
yarn add @craco/craco
修改package.json的scripts:
将原本编译使用的 react-scripts 修改为 craco
"scripts": {
- "start": "react-scripts start",
+ "start": "craco start",
- "build": "react-scripts build",
+ "build": "craco build",
- "test": "react-scripts test",
+ "test": "craco test",
"eject": "react-scripts eject"
}
这是本文的重点
由于 WebGPU 的渲染器语言为 WGSL,所以以后渲染器(shader)相关的代码我们都会写到以 .wgsl 为后缀的文件中。
但是无论是 webpack 还是 vite,他们默认都不认识 这种 .wgsl 文件资源,所以都需要我们配置一下。
添加global.d.ts:
在项目 src 目录下创建 global.d.ts 文件,增加对 .wgsl 文件的类型描述。
declare module '*.wgsl' {
const shader: string;
export default shader;
}
上面的配置意思是告诉 typescript 以后凡是 import 为 .wgsl 的文件,都把它的返回结果当做字符串。
添加craco.config.ts:
在与 src 目录的平级处,创建 craco.config.ts 文件,用来添加 webpack 相关的配置。
如果你不使用 typescript,那么忽略本文中所有和 typescript 相关的配置,此时你创建的文件名应该是 craco.config.js
我们需要告诉 webpack 如何处理 .wgsl 文件资源。
这里我们也顺道配置一下 alias
//craco.config.ts
import path from 'path'
module.exports = {
webpack: {
alias: {
"@/components": path.resolve(__dirname, "src/components/"),
"@/hooks": path.resolve(__dirname, "src/hooks/"),
"@/shader": path.resolve(__dirname, "src/shader/")
},
configure: {
module: {
rules: [
{ test: /\.wgsl$/, type: "asset/source" }
],
}
}
}
}
至此,我们已经完成了整体项目的配置。
在接下来写示例时,我们可以通过 import xxx form './shader/xx.wgsl'
这种方式引入 .wsgl 代码了。
补充:上面的操作是针对 webpack5 的,如果你使用的是 webpack4,那么你需要做的是:
-
安装 raw-loader
webpack5 已经内置了 raw-loader,而 webpack4 需要你自己添加
-
修改上述配置项中关于 rules 的配置方式
- { test: /\.wgsl$/, type: "asset/source" } + { test: /\.wgsl$/, use: "raw-loader" }
在 vite 中是通过 url 的 query 参数 ?raw
来表明 .wgsl 文件类型的。
import xxx from './shader/xx.wgsl?raw'
raw 这个词是本身翻译为 生肉,实际上就是指 “未经处理” 的原始数据
vite 还有其他支持的参数:?import、?html-proxy、?worker、?shareworker、?url ,具体含义本文不做过多介绍。
与此同时,vite 项目需要修改 tsconfig.json 中 types 的值:
{
"compilerOptions": {
"types": ["vite/client", "@webgpu/types"]
}
}
在 VSCode 插件中搜索:wgsl,找到并安装一个名为 wgsl-analyzer
的插件。
补充说明:
事实上目前 VSCode 中只有 3 个和 wgsl 相关的插件:WGSL、wgsl-analyzer、WGSL Literal
尽管第 1 个插件 WGSL 使用者数量最多,但是它没有格式化 .wgsl 文件的能力,而 wgsl-analyzer 虽然看上去使用者数量比不过前者,但是它同时支持代码高亮和格式化 .wgsl 代码,所以我推荐使用它。
目前 WebGPU 并未正式发布,所以我们只能运行在 开发版 的浏览器中。
这里我们选择 谷歌金丝雀(canary)版浏览器。
目前最新版为 103。
金丝雀版下载地址:
https://www.google.com/intl/zh-CN/chrome/canary/
当然你可能无法访问该网址
开启WebGPU:
第1步:打开 Chrome 开发版,在地址栏中输入:about://flags
第2步:在打开的页面中,搜索 "webgpu",找到 Unsafe WebGPU
,将其设置为 Enabled
。
至此,我们已经配置好了基本的 WebGPU 前端项目,那么接下来就开始真正编写示例了。
先从最基础的,绘制一个 三角形开始。