背景与价值WebGPU 提供现代图形与并行计算能力,显著提升渲染与数据处理性能。结合回退策略保证在不支持的设备上仍可用。设备与上下文async function initWebGPU(canvas: HTMLCanvasElement) {
if (!('gpu' in navigator)) return { ok: false, reason: 'unsupported' };
const adapter = await (navigator as any).gpu.requestAdapter();
const device = await adapter.requestDevice();
const ctx = (canvas.getContext('webgpu') as GPUCanvasContext);
const format = (navigator as any).gpu.getPreferredCanvasFormat();
ctx.configure({ device, format, alphaMode: 'opaque' });
return { ok: true, device, ctx, format };
}
渲染管线(三角形)const shader = /* wgsl */ `
@vertex fn vs_main(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4<f32> {
var pos = array<vec2<f32>, 3>(
vec2<f32>(0.0, 0.6),
vec2<f32>(-0.6, -0.6),
vec2<f32>(0.6, -0.6)
);
let p = pos[vi];
return vec4<f32>(p, 0.0, 1.0);
}
@fragment fn fs_main() -> @location(0) vec4<f32> {
return vec4<f32>(0.1, 0.6, 0.9, 1.0);
}
`;
function renderTriangle(device: GPUDevice, ctx: GPUCanvasContext, format: GPUTextureFormat) {
const module = device.createShaderModule({ code: shader });
const pipeline = device.createRenderPipeline({
layout: 'auto',
vertex: { module, entryPoint: 'vs_main' },
fragment: { module, entryPoint: 'fs_main', targets: [{ format }] },
primitive: { topology: 'triangle-list' }
});
const encoder = device.createCommandEncoder();
const view = ctx.getCurrentTexture().createView();
const pass = encoder.beginRenderPass({ colorAttachments: [{ view, loadOp: 'clear', clearValue: { r: 0.02, g: 0.02, b: 0.02, a: 1 }, storeOp: 'store' }] });
pass.setPipeline(pipeline);
pass.draw(3);
pass.end();
device.queue.submit([encoder.finish()]);
}
计算着色器示例const computeWGSL = /* wgsl */ `
@group(0) @binding(0) var<storage, read_write> data: array<f32>;
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
let i = gid.x;
data[i] = data[i] * 2.0;
}
`;
async function runCompute(device: GPUDevice) {
const N = 1024;
const buf = device.createBuffer({ size: N * 4, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST });
const pipeline = device.createComputePipeline({ layout: 'auto', compute: { module: device.createShaderModule({ code: computeWGSL }), entryPoint: 'main' } });
const bind = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [{ binding: 0, resource: { buffer: buf } }] });
const encoder = device.createCommandEncoder();
const pass = encoder.beginComputePass();
pass.setPipeline(pipeline); pass.setBindGroup(0, bind); pass.dispatchWorkgroups(Math.ceil(N / 64)); pass.end();
device.queue.submit([encoder.finish()]);
}
回退到 WebGL2function fallbackWebGL2(canvas: HTMLCanvasElement) {
const gl = canvas.getContext('webgl2');
if (!gl) return { ok: false };
gl.clearColor(0.02, 0.02, 0.02, 1.0); gl.clear(gl.COLOR_BUFFER_BIT);
return { ok: true };
}
指标验证(Chrome 128/Edge 130)渲染帧率:静态场景稳定 ≥ 60fps(1080p)。计算吞吐:数组大小 1e6 的倍增任务较 JS 循环提升 2×–4×(设备差异)。回退稳定性:不支持 WebGPU 的设备仍能渲染基本内容,无崩溃。测试清单设备检测:WebGPU 支持与否路径均成功;异常有清晰提示。多尺寸画布:高 DPI 下配置格式正确,颜色输出稳定。计算正确性:随机数据写回结果与预期一致。应用场景数据可视化、图像处理、科学计算、游戏与高性能 UI 动效。

发表评论 取消回复