WebGPU 渐变渲染性能对比 - GPU vs CPU 绘制
分别使用 WebGPU 和 Canvas 2D 绘制复杂渐变,实时对比帧率与 CPU/GPU 占用,展示硬件加速优势。
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 和 Canvas 2D 绘制复杂渐变,实时对比帧率与 CPU/GPU 占用,展示硬件加速优势。
展示一对旋转角度不同的三维块状图形,判断是否为同一形状的镜像或旋转。
用WebGL或Three.js(轻量版)展示一条旋转的莫比乌斯带,可用鼠标拖拽视角。
功能强大的网页科学计算器,支持基础运算、三角函数、对数、幂运算、括号优先级等。
在线生成纯CSS三角形、箭头、气泡指示器,调整方向、大小和颜色,一键复制CSS代码。
在图像上点击,利用前端模型将点击范围内的主要物体自动从背景分离。
使用 ImageDecoder API 解码图片并逐帧显示(若为动图),展示底层编解码能力。
使用 SAM 或其他前端模型,点击图片中的对象区域实现像素级分割,体验智能抠图。
根据一个基础色生成互补色、分裂互补、三角色、矩形色等经典配色方案,并显示色块和代码。
拖拽角度,在单位圆上显示sin、cos、tan的线段和数值。
输入一道和差或倍数应用题,用长度可调的条形图可视化题目关系,辅助求解。
通过Canvas生成不同粒度、颜色的噪点纹理图片,适合用作页面背景或叠加。
上传图片并在白色、黑色、透明等背景上预览效果,辅助电商首图或UI元素设计。
输入 URL,列出所有第三方域名的脚本,估算其对加载时间的影响。
配置启动画面背景色与图标,生成对应manifest和meta标签代码。
像Renpy一样通过点击推进对话,体验分支选择,用于剧情草稿演示。
在Canvas上拖拽直角三角形顶点,实时计算边长、角度和三角函数值。
给定初始原子数和半衰期,动画展示原子随时间指数衰减的图表和粒子动画。
输入已知的边长或角度,计算直角三角形的所有未知边长和锐角。
上传多张图片或拍摄连拍,调整帧延迟和尺寸,纯前端合成GIF动画并下载。
输入一个数,用巴比伦方法逐步展示迭代逼近其平方根的过程。
在线对图片应用高斯模糊滤镜,可通过滑块调节模糊半径强度,实时预览效果并下载。
在线响应式布局测试器,同时预览常见设备分辨率的网页显示效果,帮助检查前端适配。
将两到三张有重叠的手持照片拖入,手动寻找重叠区域自动混合为宽幅全景图。
输入ax^2+bx+c=0的系数,显示求解过程、判别式和根的性质。
构建二叉树节点,动态演示三种深度优先遍历顺序及逐层遍历。
构建或随机生成二叉树,逐步动画展示前序、中序、后序和层序遍历的路径。
根据数字将网格分割成矩形,使得数字等于矩形面积,拖动创建区域,锻炼几何直觉。
上传GIF并自动水平平铺提取各帧,生成对应的CSS精灵图定位代码。
使用递归回溯或Prim算法生成随机迷宫,可设置尺寸,生成后提供求解动画或图片导出。