WebGPU 渲染基础三角形 - 入门演示
使用 WebGPU API 绘制一个彩色三角形,展示初始化、管线、着色器和绘制循环。
UD5工具箱
体验下一代 Web 图形 API —— 使用 WGSL 着色语言在 GPU 上渲染你的第一个三角形
// 顶点着色器 - 处理旋转与坐标变换 struct VertexOutput { @builtin(position) position: vec4<f32>, @location(0) color: vec4<f32>, }; struct Uniforms { angle: f32, time: f32, colorMul: vec4<f32>, }; @group(0) @binding(0) var<uniform> uniforms: Uniforms; @vertex fn vs_main( @location(0) pos: vec2<f32>, @location(1) col: vec4<f32>, ) -> VertexOutput { var out: VertexOutput; let c = cos(uniforms.angle); let s = sin(uniforms.angle); let rx = pos.x * c - pos.y * s; let ry = pos.x * s + pos.y * c; out.position = vec4<f32>(rx, ry, 0.0, 1.0); out.color = col; return out; } // 片元着色器 - 输出插值颜色 @fragment fn fs_main( @location(0) color: vec4<f32>, ) -> @location(0) vec4<f32> { return color * uniforms.colorMul; }
// 1. 检查 WebGPU 支持 if (!navigator.gpu) { console.error('WebGPU 不受支持'); } // 2. 请求 GPU 适配器与设备 const adapter = await navigator.gpu.requestAdapter(); const device = await adapter.requestDevice(); // 3. 配置 Canvas Context const ctx = canvas.getContext('webgpu'); ctx.configure({ device, format: navigator.gpu.getPreferredCanvasFormat() }); // 4. 创建顶点缓冲区 (3个顶点, RGB渐变) const vertices = new Float32Array([ 0.0, 0.6, 1,0,0,1, // 顶部 - 红色 -0.5, -0.4, 0,1,0,1, // 左下 - 绿色 0.5, -0.4, 0,0,1,1, // 右下 - 蓝色 ]); const vBuf = device.createBuffer({ size: vertices.byteLength, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST, }); device.queue.writeBuffer(vBuf, 0, vertices); // 5. 创建渲染管线 const pipeline = device.createRenderPipeline({ ... }); // 6. 渲染循环 function render() { const cmd = device.createCommandEncoder(); const pass = cmd.beginRenderPass({ ... }); pass.setPipeline(pipeline); pass.draw(3); pass.end(); device.queue.submit([cmd.finish()]); requestAnimationFrame(render); }
┌──────────────────────────────────────┐
│ ① 检查浏览器 WebGPU 支持 │
│ navigator.gpu ? │
└────────────┬─────────────────────────┘
│ ✅
┌────────────▼─────────────────────────┐
│ ② 请求 GPU 适配器 & 设备 │
│ adapter.requestDevice() │
└────────────┬─────────────────────────┘
│
┌────────────▼─────────────────────────┐
│ ③ 配置 Canvas 与 Swap Chain │
│ ctx.configure({device, format}) │
└────────────┬─────────────────────────┘
│
┌────────────▼─────────────────────────┐
│ ④ 创建顶点缓冲区 + Uniform缓冲区 │
│ 上传三角形顶点数据到 GPU │
└────────────┬─────────────────────────┘
│
┌────────────▼─────────────────────────┐
│ ⑤ 编译 WGSL 着色器 → ShaderModule │
│ 顶点着色器 + 片元着色器 │
└────────────┬─────────────────────────┘
│
┌────────────▼─────────────────────────┐
│ ⑥ 构建渲染管线 (Pipeline) │
│ 绑定着色器、顶点布局、混合模式 │
└────────────┬─────────────────────────┘
│
┌────────────▼─────────────────────────┐
│ ⑦ 每帧: 命令编码器 → 渲染通道 │
│ cmd.beginRenderPass() │
│ → setPipeline → draw(3) → end │
│ → queue.submit() │
└──────────────────────────────────────┘
WebGPU 是新一代 Web 图形与计算 API,为现代 GPU 硬件设计。相比 WebGL:
截至 2024 年,以下浏览器已正式支持 WebGPU:
dom.webgpu.enabled 标志)提示:需要 HTTPS 或 localhost 安全上下文才能使用 WebGPU。
WGSL(WebGPU Shading Language) 是专为 WebGPU 设计的着色语言,语法类似 Rust:
fn 定义函数,var 声明可变变量,let 声明不可变变量f32、vec2、vec3、vec4、mat4x4 等@location、@binding、@group 等注解连接 CPU 端数据三个顶点分别被赋予了红、绿、蓝颜色。GPU 在光栅化阶段会自动计算三角形内部每个像素的颜色——通过对三个顶点颜色进行重心坐标插值。这就是为什么你看到三角形内部呈现出平滑的彩虹渐变效果,这是 GPU 硬件免费提供的功能。
常见原因:
性能提升因场景而异:
使用 WebGPU API 绘制一个彩色三角形,展示初始化、管线、着色器和绘制循环。
分别使用 WebGPU 和 Canvas 2D 绘制复杂渐变,实时对比帧率与 CPU/GPU 占用,展示硬件加速优势。
在图片上拖拽四个角点,实现任意四边形映射,模拟三维空间中的图片摆放效果。
展示一对旋转角度不同的三维块状图形,判断是否为同一形状的镜像或旋转。
用WebGL或Three.js(轻量版)展示一条旋转的莫比乌斯带,可用鼠标拖拽视角。
功能强大的网页科学计算器,支持基础运算、三角函数、对数、幂运算、括号优先级等。
对长列表应用 content-visibility:auto,对比启用前后渲染时间和内存占用。
在线生成纯CSS三角形、箭头、气泡指示器,调整方向、大小和颜色,一键复制CSS代码。
在图像上点击,利用前端模型将点击范围内的主要物体自动从背景分离。
使用 ImageDecoder API 解码图片并逐帧显示(若为动图),展示底层编解码能力。
使用 SAM 或其他前端模型,点击图片中的对象区域实现像素级分割,体验智能抠图。
根据一个基础色生成互补色、分裂互补、三角色、矩形色等经典配色方案,并显示色块和代码。
拖拽角度,在单位圆上显示sin、cos、tan的线段和数值。
设计带有大标题、描述、CTA 按钮和背景图的首屏区域,生成完整代码。
编写 HTML 和 import map,在浏览器中直接导入裸标识符模块并执行。
输入一道和差或倍数应用题,用长度可调的条形图可视化题目关系,辅助求解。
通过Canvas生成不同粒度、颜色的噪点纹理图片,适合用作页面背景或叠加。
分别在主线程和 Worker 中使用 Canvas 执行密集绘制,对比 FPS 和主线程阻塞程度。
上传图片并在白色、黑色、透明等背景上预览效果,辅助电商首图或UI元素设计。
输入 URL,列出所有第三方域名的脚本,估算其对加载时间的影响。
对比启用和不启用 content-visibility: auto 时页面大量列表的渲染性能差异。
配置启动画面背景色与图标,生成对应manifest和meta标签代码。
展示 Hopcroft-Karp 算法寻找最大匹配的过程,包括 BFS 和 DFS 阶段。
像Renpy一样通过点击推进对话,体验分支选择,用于剧情草稿演示。
在Canvas上拖拽直角三角形顶点,实时计算边长、角度和三角函数值。
给定初始原子数和半衰期,动画展示原子随时间指数衰减的图表和粒子动画。
显示当前页面动画的帧率、单帧耗时和丢帧比例,辅助流畅度调试。
添加一系列异步任务并观察其按顺序执行的过程,对比并行与串行效果。
输入已知的边长或角度,计算直角三角形的所有未知边长和锐角。
上传多张图片或拍摄连拍,调整帧延迟和尺寸,纯前端合成GIF动画并下载。