如何将图像处理代码完全迁移至Web Worker
问题:在Web Worker中完成高度图地形构建,摆脱UI线程依赖
我希望将Canvas控制权完全转移至Web Worker,并使用Offscreen Canvas。但当前代码中的makeImg函数依赖UI线程的Image()接口,而我仅需用该图像数据构建网格,无需展示图像。能否在Web Worker中完成所有处理,直到生成完整可展示的网格后再与UI交互?
示例效果
- 用于提取高度信息的位图:

- 生成的无纹理地形效果:

我正以上述位图作为高度图构建地形,利用像素值生成顶点、计算法线与纹理坐标,最终地形将展示在页面中。相关代码如下:
async function readImgHeightMap (src, crossOrigin) { return new Promise ((resolve, reject) => { readImg (src, crossOrigin).then ((imgData) => { let heightmap = []; //j, row -- z coordinate; i, column -- x coordinate //imgData.data, height -- y coordinate for (let j = 0, j0 = 0; j < imgData.height; j++, j0 += imgData.width * 4) { heightmap[j] = []; for (let i = 0, i0 = 0; i < imgData.width; i++, i0 += 4) heightmap[j][i] = imgData.data[j0 + i0]; } resolve( {data:heightmap, height:imgData.height, width:imgData.width} ); }); }); } async function readImg (src, crossOrigin) { return new Promise ( (resolve, reject) => { makeOffscreenFromImg (src, crossOrigin).then((canvas) => { let ctx = canvas.getContext("2d"); let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height, { colorSpace: "srgb" }); resolve(imgData); }); }); } async function makeOffscreenFromImg (src, crossOrigin) { let img = makeImg(src, crossOrigin); return new Promise((resolve, reject) => { img.addEventListener('load', () => { let cnv = new OffscreenCanvas(img.width, img.height); cnv.getContext("2d").drawImage(img, 0, 0); resolve(cnv); }); img.addEventListener('error', (event) => { console.log(event); reject (event); } ); }); } function makeImg (src, crossOrigin) { let image = new Image (); let canvas = document.createElement("canvas"); if (crossOrigin) image.crossOrigin = crossOrigin; image.src = src; return image; }
备注
- 操作说明:按下SHIFT键并拖动鼠标可移动相机,按下CTRL键可旋转相机;点击可开启持续动画,移动端可点击屏幕。
- 版权提示:请勿将高度图图像用于个人用途,该图像具有商业版权。
内容的提问来源于stack exchange,提问作者armagedescu
相关产品推荐
相关产品推荐

